@feathersjs/schema 5.0.0-pre.30 → 5.0.0-pre.32
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 +14 -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/json-schema.d.ts +7 -8
- package/lib/json-schema.js +4 -3
- package/lib/json-schema.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 +6 -7
- package/src/hooks/resolve.ts +60 -47
- package/src/json-schema.ts +10 -13
- package/src/resolver.ts +11 -3
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,20 @@
|
|
|
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.32](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.31...v5.0.0-pre.32) (2022-10-26)
|
|
7
|
+
|
|
8
|
+
### Bug Fixes
|
|
9
|
+
|
|
10
|
+
- **schema:** Improve resolver performance ([#2822](https://github.com/feathersjs/feathers/issues/2822)) ([5fa900f](https://github.com/feathersjs/feathers/commit/5fa900f90d55859332c90283dddddab26ae3759c))
|
|
11
|
+
- **schema:** Use the same options for resolveData hook ([#2833](https://github.com/feathersjs/feathers/issues/2833)) ([ed3b050](https://github.com/feathersjs/feathers/commit/ed3b05051db6886729d4824825ca8f00c2459af7))
|
|
12
|
+
|
|
13
|
+
# [5.0.0-pre.31](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.30...v5.0.0-pre.31) (2022-10-12)
|
|
14
|
+
|
|
15
|
+
### Features
|
|
16
|
+
|
|
17
|
+
- **cli:** Generate full client test suite and improve typed client ([#2788](https://github.com/feathersjs/feathers/issues/2788)) ([57119b6](https://github.com/feathersjs/feathers/commit/57119b6bb2797f7297cf054268a248c093ecd538))
|
|
18
|
+
- **cli:** Improve generated schema definitions ([#2783](https://github.com/feathersjs/feathers/issues/2783)) ([474a9fd](https://github.com/feathersjs/feathers/commit/474a9fda2107e9bcf357746320a8e00cda8182b6))
|
|
19
|
+
|
|
6
20
|
# [5.0.0-pre.30](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.29...v5.0.0-pre.30) (2022-10-07)
|
|
7
21
|
|
|
8
22
|
### 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/json-schema.d.ts
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
import { JSONSchema } from 'json-schema-to-ts';
|
|
2
|
-
import { TObject } from '@sinclair/typebox';
|
|
3
2
|
import { JSONSchemaDefinition, Ajv, Validator } from './schema';
|
|
4
3
|
export declare type DataSchemaMap = {
|
|
5
|
-
create: JSONSchemaDefinition
|
|
6
|
-
update?: JSONSchemaDefinition
|
|
7
|
-
patch?: JSONSchemaDefinition
|
|
4
|
+
create: JSONSchemaDefinition;
|
|
5
|
+
update?: JSONSchemaDefinition;
|
|
6
|
+
patch?: JSONSchemaDefinition;
|
|
8
7
|
};
|
|
9
8
|
export declare type DataValidatorMap = {
|
|
10
9
|
create: Validator;
|
|
@@ -18,7 +17,7 @@ export declare type DataValidatorMap = {
|
|
|
18
17
|
* @param validator The AJV validation instance
|
|
19
18
|
* @returns A compiled validation function
|
|
20
19
|
*/
|
|
21
|
-
export declare const getValidator: <T = any, R = T>(schema: JSONSchemaDefinition
|
|
20
|
+
export declare const getValidator: <T = any, R = T>(schema: JSONSchemaDefinition, validator: Ajv) => Validator<T, R>;
|
|
22
21
|
/**
|
|
23
22
|
* Returns compiled validation functions to validate data for the `create`, `update` and `patch`
|
|
24
23
|
* service methods. If not passed explicitly, the `update` validator will be the same as the `create`
|
|
@@ -29,7 +28,7 @@ export declare const getValidator: <T = any, R = T>(schema: JSONSchemaDefinition
|
|
|
29
28
|
* @param validator The Ajv instance to use as the validator
|
|
30
29
|
* @returns A map of validator functions
|
|
31
30
|
*/
|
|
32
|
-
export declare const getDataValidator: (def: JSONSchemaDefinition |
|
|
31
|
+
export declare const getDataValidator: (def: JSONSchemaDefinition | DataSchemaMap, validator: Ajv) => DataValidatorMap;
|
|
33
32
|
export declare type PropertyQuery<D extends JSONSchema> = {
|
|
34
33
|
anyOf: [
|
|
35
34
|
D,
|
|
@@ -84,12 +83,12 @@ export declare const queryProperty: <T extends import("json-schema-to-ts").JSONS
|
|
|
84
83
|
/**
|
|
85
84
|
* Creates Feathers a query syntax compatible JSON schema for multiple properties.
|
|
86
85
|
*
|
|
87
|
-
* @param
|
|
86
|
+
* @param definitions A map of property definitions
|
|
88
87
|
* @returns The JSON schema definition for the Feathers query syntax for multiple properties
|
|
89
88
|
*/
|
|
90
89
|
export declare const queryProperties: <T extends {
|
|
91
90
|
[key: string]: import("json-schema-to-ts").JSONSchema7;
|
|
92
|
-
}>(
|
|
91
|
+
}>(definitions: T) => { [K in keyof T]: PropertyQuery<T[K]>; };
|
|
93
92
|
/**
|
|
94
93
|
* Creates a JSON schema for the complete Feathers query syntax including `$limit`, $skip`
|
|
95
94
|
* and `$sort` and `$select` for the allowed properties.
|
package/lib/json-schema.js
CHANGED
|
@@ -77,12 +77,13 @@ exports.queryProperty = queryProperty;
|
|
|
77
77
|
/**
|
|
78
78
|
* Creates Feathers a query syntax compatible JSON schema for multiple properties.
|
|
79
79
|
*
|
|
80
|
-
* @param
|
|
80
|
+
* @param definitions A map of property definitions
|
|
81
81
|
* @returns The JSON schema definition for the Feathers query syntax for multiple properties
|
|
82
82
|
*/
|
|
83
|
-
const queryProperties = (
|
|
83
|
+
const queryProperties = (definitions) => Object.keys(definitions).reduce((res, key) => {
|
|
84
84
|
const result = res;
|
|
85
|
-
|
|
85
|
+
const definition = definitions[key];
|
|
86
|
+
result[key] = (0, exports.queryProperty)(definition);
|
|
86
87
|
return result;
|
|
87
88
|
}, {});
|
|
88
89
|
exports.queryProperties = queryProperties;
|
package/lib/json-schema.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json-schema.js","sourceRoot":"","sources":["../src/json-schema.ts"],"names":[],"mappings":";;;AAAA,iDAAuC;
|
|
1
|
+
{"version":3,"file":"json-schema.js","sourceRoot":"","sources":["../src/json-schema.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.32",
|
|
5
5
|
"homepage": "https://feathersjs.com",
|
|
6
6
|
"main": "lib/",
|
|
7
7
|
"types": "lib/",
|
|
@@ -54,18 +54,17 @@
|
|
|
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.32",
|
|
58
|
+
"@feathersjs/errors": "^5.0.0-pre.32",
|
|
59
|
+
"@feathersjs/feathers": "^5.0.0-pre.32",
|
|
60
60
|
"@feathersjs/hooks": "^0.7.5",
|
|
61
61
|
"@types/json-schema": "^7.0.11",
|
|
62
62
|
"ajv": "^8.11.0",
|
|
63
63
|
"ajv-formats": "^2.1.1",
|
|
64
|
-
"json-schema": "^0.4.0",
|
|
65
64
|
"json-schema-to-ts": "^2.5.5"
|
|
66
65
|
},
|
|
67
66
|
"devDependencies": {
|
|
68
|
-
"@feathersjs/memory": "^5.0.0-pre.
|
|
67
|
+
"@feathersjs/memory": "^5.0.0-pre.32",
|
|
69
68
|
"@types/mocha": "^10.0.0",
|
|
70
69
|
"@types/node": "^18.8.2",
|
|
71
70
|
"ajv-formats": "^2.1.1",
|
|
@@ -73,5 +72,5 @@
|
|
|
73
72
|
"shx": "^0.3.4",
|
|
74
73
|
"typescript": "^4.8.4"
|
|
75
74
|
},
|
|
76
|
-
"gitHead": "
|
|
75
|
+
"gitHead": "b405e205fc6d9fbd42b42c7a3f30ea4bf33d121d"
|
|
77
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/json-schema.ts
CHANGED
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
import { _ } from '@feathersjs/commons'
|
|
2
2
|
import { JSONSchema } from 'json-schema-to-ts'
|
|
3
|
-
import { TObject } from '@sinclair/typebox'
|
|
4
3
|
import { JSONSchemaDefinition, Ajv, Validator } from './schema'
|
|
5
4
|
|
|
6
5
|
export type DataSchemaMap = {
|
|
7
|
-
create: JSONSchemaDefinition
|
|
8
|
-
update?: JSONSchemaDefinition
|
|
9
|
-
patch?: JSONSchemaDefinition
|
|
6
|
+
create: JSONSchemaDefinition
|
|
7
|
+
update?: JSONSchemaDefinition
|
|
8
|
+
patch?: JSONSchemaDefinition
|
|
10
9
|
}
|
|
11
10
|
|
|
12
11
|
export type DataValidatorMap = {
|
|
@@ -22,10 +21,7 @@ export type DataValidatorMap = {
|
|
|
22
21
|
* @param validator The AJV validation instance
|
|
23
22
|
* @returns A compiled validation function
|
|
24
23
|
*/
|
|
25
|
-
export const getValidator = <T = any, R = T>(
|
|
26
|
-
schema: JSONSchemaDefinition | TObject,
|
|
27
|
-
validator: Ajv
|
|
28
|
-
): Validator<T, R> =>
|
|
24
|
+
export const getValidator = <T = any, R = T>(schema: JSONSchemaDefinition, validator: Ajv): Validator<T, R> =>
|
|
29
25
|
validator.compile({
|
|
30
26
|
$async: true,
|
|
31
27
|
...(schema as any)
|
|
@@ -42,7 +38,7 @@ export const getValidator = <T = any, R = T>(
|
|
|
42
38
|
* @returns A map of validator functions
|
|
43
39
|
*/
|
|
44
40
|
export const getDataValidator = (
|
|
45
|
-
def: JSONSchemaDefinition |
|
|
41
|
+
def: JSONSchemaDefinition | DataSchemaMap,
|
|
46
42
|
validator: Ajv
|
|
47
43
|
): DataValidatorMap => {
|
|
48
44
|
const schema = ((def as any).create ? def : { create: def }) as DataSchemaMap
|
|
@@ -129,14 +125,15 @@ export const queryProperty = <T extends JSONSchema>(def: T) => {
|
|
|
129
125
|
/**
|
|
130
126
|
* Creates Feathers a query syntax compatible JSON schema for multiple properties.
|
|
131
127
|
*
|
|
132
|
-
* @param
|
|
128
|
+
* @param definitions A map of property definitions
|
|
133
129
|
* @returns The JSON schema definition for the Feathers query syntax for multiple properties
|
|
134
130
|
*/
|
|
135
|
-
export const queryProperties = <T extends { [key: string]: JSONSchema }>(
|
|
136
|
-
Object.keys(
|
|
131
|
+
export const queryProperties = <T extends { [key: string]: JSONSchema }>(definitions: T) =>
|
|
132
|
+
Object.keys(definitions).reduce((res, key) => {
|
|
137
133
|
const result = res as any
|
|
134
|
+
const definition = definitions[key]
|
|
138
135
|
|
|
139
|
-
result[key] = queryProperty(definition
|
|
136
|
+
result[key] = queryProperty(definition)
|
|
140
137
|
|
|
141
138
|
return result
|
|
142
139
|
}, {} as { [K in keyof T]: PropertyQuery<T[K]> })
|
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 = {}
|