@feathersjs/adapter-commons 5.0.0-pre.21 → 5.0.0-pre.24
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 +27 -0
- package/lib/declarations.d.ts +2 -2
- package/lib/index.js.map +1 -1
- package/lib/query.js +4 -5
- package/lib/query.js.map +1 -1
- package/lib/service.js +5 -5
- package/lib/service.js.map +1 -1
- package/lib/sort.js +1 -1
- package/lib/sort.js.map +1 -1
- package/package.json +9 -9
- package/src/declarations.ts +41 -38
- package/src/index.ts +14 -14
- package/src/query.ts +38 -39
- package/src/service.ts +83 -79
- package/src/sort.ts +81 -41
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,33 @@
|
|
|
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.24](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.23...v5.0.0-pre.24) (2022-06-21)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
### Features
|
|
10
|
+
|
|
11
|
+
* **knex:** Add KnexJS SQL database adapter to core ([#2671](https://github.com/feathersjs/feathers/issues/2671)) ([9380fff](https://github.com/feathersjs/feathers/commit/9380fff58596e8bb90b8bb098d2795b7eadfec20))
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
# [5.0.0-pre.23](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.22...v5.0.0-pre.23) (2022-06-06)
|
|
18
|
+
|
|
19
|
+
**Note:** Version bump only for package @feathersjs/adapter-commons
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
# [5.0.0-pre.22](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.21...v5.0.0-pre.22) (2022-05-24)
|
|
26
|
+
|
|
27
|
+
**Note:** Version bump only for package @feathersjs/adapter-commons
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
|
|
6
33
|
# [5.0.0-pre.21](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.20...v5.0.0-pre.21) (2022-05-23)
|
|
7
34
|
|
|
8
35
|
**Note:** Version bump only for package @feathersjs/adapter-commons
|
package/lib/declarations.d.ts
CHANGED
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,iDAAuC;AAGvC,iDAA8B;AAC9B,4CAAyB;AACzB,iCAAyD;AAAhD,oGAAA,WAAW,OAAA;AAAE,gGAAA,OAAO,OAAA;AAAE,kGAAA,SAAS,OAAA;AACxC,yCAAsB;AAEtB,0DAA0D;AAC1D,6DAA6D;AAC7D,+BAA+B;AAC/B,SAAgB,MAAM,CAAC,MAAc,EAAE,GAAG,WAAqB;;IAC7D,MAAM,WAAW,GAAyB,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,KAAK,0CAAE,OAAO,CAAA;IAEhE,IAAI,CAAC,WAAW,EAAE;QAChB,OAAO,CAAC,MAAW,EAAE,EAAE,CAAC,MAAM,CAAA;KAC/B;IAED,MAAM,YAAY,GAAG,WAAW,CAAC,MAAM,CAAC,WAAW,CAAC,CAAA;IACpD,MAAM,OAAO,GAAG,CAAC,MAAW,EAAE,EAAE,CAAC,WAAC,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,YAAY,CAAC,CAAA;IAEhE,OAAO,CAAC,MAAW,EAAE,EAAE;QACrB,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;YACzB,OAAO,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;SAC3B;QAED,OAAO,OAAO,CAAC,MAAM,CAAC,CAAA;IACxB,CAAC,CAAA;AACH,CAAC;AAjBD,wBAiBC"}
|
package/lib/query.js
CHANGED
|
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.filterQuery = exports.FILTERS = exports.OPERATORS = void 0;
|
|
4
4
|
const commons_1 = require("@feathersjs/commons");
|
|
5
5
|
const errors_1 = require("@feathersjs/errors");
|
|
6
|
-
const parse = (value) => typeof value !== 'undefined' ? parseInt(value, 10) : value;
|
|
6
|
+
const parse = (value) => (typeof value !== 'undefined' ? parseInt(value, 10) : value);
|
|
7
7
|
const isPlainObject = (value) => commons_1._.isObject(value) && value.constructor === {}.constructor;
|
|
8
8
|
const validateQueryProperty = (query, operators = []) => {
|
|
9
9
|
if (!isPlainObject(query)) {
|
|
@@ -58,8 +58,7 @@ exports.FILTERS = {
|
|
|
58
58
|
return sort;
|
|
59
59
|
}
|
|
60
60
|
return Object.keys(sort).reduce((result, key) => {
|
|
61
|
-
result[key] = typeof sort[key] === 'object'
|
|
62
|
-
? sort[key] : parse(sort[key]);
|
|
61
|
+
result[key] = typeof sort[key] === 'object' ? sort[key] : parse(sort[key]);
|
|
63
62
|
return result;
|
|
64
63
|
}, {});
|
|
65
64
|
},
|
|
@@ -75,13 +74,13 @@ exports.FILTERS = {
|
|
|
75
74
|
},
|
|
76
75
|
$select: (select) => {
|
|
77
76
|
if (Array.isArray(select)) {
|
|
78
|
-
return select.map(current => `${current}`);
|
|
77
|
+
return select.map((current) => `${current}`);
|
|
79
78
|
}
|
|
80
79
|
return select;
|
|
81
80
|
},
|
|
82
81
|
$or: (or, { operators }) => {
|
|
83
82
|
if (Array.isArray(or)) {
|
|
84
|
-
return or.map(current => validateQueryProperty(current, operators));
|
|
83
|
+
return or.map((current) => validateQueryProperty(current, operators));
|
|
85
84
|
}
|
|
86
85
|
return or;
|
|
87
86
|
}
|
package/lib/query.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query.js","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"query.js","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"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"}
|
package/lib/service.js
CHANGED
|
@@ -117,8 +117,8 @@ class AdapterBase {
|
|
|
117
117
|
throw new errors_1.MethodNotAllowed('Can not create multiple entries');
|
|
118
118
|
}
|
|
119
119
|
const payload = Array.isArray(data)
|
|
120
|
-
?
|
|
121
|
-
:
|
|
120
|
+
? await Promise.all(data.map((current) => this.sanitizeData(current, params)))
|
|
121
|
+
: await this.sanitizeData(data, params);
|
|
122
122
|
return this.$create(payload, params);
|
|
123
123
|
}
|
|
124
124
|
/**
|
|
@@ -132,7 +132,7 @@ class AdapterBase {
|
|
|
132
132
|
*/
|
|
133
133
|
async _update(id, data, params) {
|
|
134
134
|
if (id === null || Array.isArray(data)) {
|
|
135
|
-
throw new errors_1.BadRequest(
|
|
135
|
+
throw new errors_1.BadRequest("You can not replace multiple instances. Did you mean 'patch'?");
|
|
136
136
|
}
|
|
137
137
|
const payload = await this.sanitizeData(data, params);
|
|
138
138
|
const query = await this.sanitizeQuery(params);
|
|
@@ -145,7 +145,7 @@ class AdapterBase {
|
|
|
145
145
|
if (id === null && !this.allowsMulti('patch', params)) {
|
|
146
146
|
throw new errors_1.MethodNotAllowed('Can not patch multiple entries');
|
|
147
147
|
}
|
|
148
|
-
const query = await this.sanitizeQuery(params);
|
|
148
|
+
const { $limit, ...query } = await this.sanitizeQuery(params);
|
|
149
149
|
const payload = await this.sanitizeData(data, params);
|
|
150
150
|
return this.$patch(id, payload, {
|
|
151
151
|
...params,
|
|
@@ -156,7 +156,7 @@ class AdapterBase {
|
|
|
156
156
|
if (id === null && !this.allowsMulti('remove', params)) {
|
|
157
157
|
throw new errors_1.MethodNotAllowed('Can not remove multiple entries');
|
|
158
158
|
}
|
|
159
|
-
const query = await this.sanitizeQuery(params);
|
|
159
|
+
const { $limit, ...query } = await this.sanitizeQuery(params);
|
|
160
160
|
return this.$remove(id, {
|
|
161
161
|
...params,
|
|
162
162
|
query
|
package/lib/service.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.js","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":";;;AAAA,+
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"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"}
|
package/lib/sort.js
CHANGED
|
@@ -93,7 +93,7 @@ exports.compare = compare;
|
|
|
93
93
|
// $sort special query parameter
|
|
94
94
|
function sorter($sort) {
|
|
95
95
|
const get = (value, path) => path.reduce((value, key) => value[key], value);
|
|
96
|
-
const compares = Object.keys($sort).map(key => {
|
|
96
|
+
const compares = Object.keys($sort).map((key) => {
|
|
97
97
|
const direction = $sort[key];
|
|
98
98
|
const path = key.split('.');
|
|
99
99
|
if (path.length === 1) {
|
package/lib/sort.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sort.js","sourceRoot":"","sources":["../src/sort.ts"],"names":[],"mappings":";AAAA,4EAA4E;AAC5E,4GAA4G;;;AAE5G,SAAgB,UAAU,
|
|
1
|
+
{"version":3,"file":"sort.js","sourceRoot":"","sources":["../src/sort.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@feathersjs/adapter-commons",
|
|
3
|
-
"version": "5.0.0-pre.
|
|
3
|
+
"version": "5.0.0-pre.24",
|
|
4
4
|
"description": "Shared database adapter utility functions",
|
|
5
5
|
"homepage": "https://feathersjs.com",
|
|
6
6
|
"keywords": [
|
|
@@ -49,19 +49,19 @@
|
|
|
49
49
|
"access": "public"
|
|
50
50
|
},
|
|
51
51
|
"dependencies": {
|
|
52
|
-
"@feathersjs/commons": "^5.0.0-pre.
|
|
53
|
-
"@feathersjs/errors": "^5.0.0-pre.
|
|
54
|
-
"@feathersjs/feathers": "^5.0.0-pre.
|
|
52
|
+
"@feathersjs/commons": "^5.0.0-pre.24",
|
|
53
|
+
"@feathersjs/errors": "^5.0.0-pre.24",
|
|
54
|
+
"@feathersjs/feathers": "^5.0.0-pre.24"
|
|
55
55
|
},
|
|
56
56
|
"devDependencies": {
|
|
57
57
|
"@types/mocha": "^9.1.1",
|
|
58
58
|
"@types/mongodb": "^4.0.6",
|
|
59
|
-
"@types/node": "^17.0.
|
|
59
|
+
"@types/node": "^17.0.40",
|
|
60
60
|
"mocha": "^10.0.0",
|
|
61
|
-
"mongodb": "^4.
|
|
61
|
+
"mongodb": "^4.6.0",
|
|
62
62
|
"shx": "^0.3.4",
|
|
63
|
-
"ts-node": "^10.
|
|
64
|
-
"typescript": "^4.
|
|
63
|
+
"ts-node": "^10.8.1",
|
|
64
|
+
"typescript": "^4.7.3"
|
|
65
65
|
},
|
|
66
|
-
"gitHead": "
|
|
66
|
+
"gitHead": "72779fa2938f43d7b345b6861ff0035481a07de3"
|
|
67
67
|
}
|
package/src/declarations.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { Query, Params, Paginated, Id, NullableId } from '@feathersjs/feathers'
|
|
1
|
+
import { Query, Params, Paginated, Id, NullableId } from '@feathersjs/feathers'
|
|
2
2
|
|
|
3
3
|
export type FilterQueryOptions = {
|
|
4
|
-
filters?: FilterSettings
|
|
5
|
-
operators?: string[]
|
|
6
|
-
paginate?: PaginationParams
|
|
4
|
+
filters?: FilterSettings
|
|
5
|
+
operators?: string[]
|
|
6
|
+
paginate?: PaginationParams
|
|
7
7
|
}
|
|
8
8
|
|
|
9
9
|
export type QueryFilter = (value: any, options: FilterQueryOptions) => any
|
|
@@ -13,56 +13,59 @@ export type FilterSettings = {
|
|
|
13
13
|
}
|
|
14
14
|
|
|
15
15
|
export interface PaginationOptions {
|
|
16
|
-
default?: number
|
|
17
|
-
max?: number
|
|
16
|
+
default?: number
|
|
17
|
+
max?: number
|
|
18
18
|
}
|
|
19
19
|
|
|
20
|
-
export type PaginationParams = false | PaginationOptions
|
|
20
|
+
export type PaginationParams = false | PaginationOptions
|
|
21
21
|
|
|
22
22
|
export interface AdapterServiceOptions {
|
|
23
23
|
/**
|
|
24
24
|
* Whether to allow multiple updates for everything (`true`) or specific methods (e.g. `['create', 'remove']`)
|
|
25
25
|
*/
|
|
26
|
-
multi?: boolean | string[]
|
|
26
|
+
multi?: boolean | string[]
|
|
27
27
|
/**
|
|
28
28
|
* The name of the id property
|
|
29
29
|
*/
|
|
30
|
-
id?: string
|
|
30
|
+
id?: string
|
|
31
31
|
/**
|
|
32
32
|
* Pagination settings for this service
|
|
33
33
|
*/
|
|
34
|
-
paginate?: PaginationParams
|
|
34
|
+
paginate?: PaginationParams
|
|
35
35
|
/**
|
|
36
36
|
* A list of additional property query operators to allow in a query
|
|
37
37
|
*/
|
|
38
|
-
operators?: string[]
|
|
38
|
+
operators?: string[]
|
|
39
39
|
/**
|
|
40
40
|
* An object of additional top level query filters, e.g. `{ $populate: true }`
|
|
41
41
|
* Can also be a converter function like `{ $ignoreCase: (value) => value === 'true' ? true : false }`
|
|
42
42
|
*/
|
|
43
|
-
filters?: FilterSettings
|
|
43
|
+
filters?: FilterSettings
|
|
44
44
|
/**
|
|
45
45
|
* @deprecated Use service `events` option when registering the service with `app.use`.
|
|
46
46
|
*/
|
|
47
|
-
events?: string[]
|
|
47
|
+
events?: string[]
|
|
48
48
|
/**
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
whitelist?: string[]
|
|
49
|
+
* @deprecated renamed to `operators`.
|
|
50
|
+
*/
|
|
51
|
+
whitelist?: string[]
|
|
52
52
|
}
|
|
53
53
|
|
|
54
54
|
export interface AdapterQuery extends Query {
|
|
55
|
-
$limit?: number
|
|
56
|
-
$skip?: number
|
|
57
|
-
$select?: string[]
|
|
58
|
-
$sort?: { [key: string]: 1
|
|
55
|
+
$limit?: number
|
|
56
|
+
$skip?: number
|
|
57
|
+
$select?: string[]
|
|
58
|
+
$sort?: { [key: string]: 1 | -1 }
|
|
59
59
|
}
|
|
60
60
|
/**
|
|
61
61
|
* Additional `params` that can be passed to an adapter service method call.
|
|
62
62
|
*/
|
|
63
|
-
export interface AdapterParams<
|
|
64
|
-
|
|
65
|
-
|
|
63
|
+
export interface AdapterParams<
|
|
64
|
+
Q = AdapterQuery,
|
|
65
|
+
A extends Partial<AdapterServiceOptions> = Partial<AdapterServiceOptions>
|
|
66
|
+
> extends Params<Q> {
|
|
67
|
+
adapter?: A
|
|
68
|
+
paginate?: PaginationParams
|
|
66
69
|
}
|
|
67
70
|
|
|
68
71
|
/**
|
|
@@ -84,9 +87,9 @@ export interface InternalServiceMethods<T = any, D = Partial<T>, P extends Adapt
|
|
|
84
87
|
*
|
|
85
88
|
* @param _params - Service call parameters {@link Params}
|
|
86
89
|
*/
|
|
87
|
-
$find(_params?: P & { paginate?: PaginationOptions }): Promise<Paginated<T
|
|
88
|
-
$find(_params?: P & { paginate: false }): Promise<T[]
|
|
89
|
-
$find(params?: P): Promise<T[] | Paginated<T
|
|
90
|
+
$find(_params?: P & { paginate?: PaginationOptions }): Promise<Paginated<T>>
|
|
91
|
+
$find(_params?: P & { paginate: false }): Promise<T[]>
|
|
92
|
+
$find(params?: P): Promise<T[] | Paginated<T>>
|
|
90
93
|
|
|
91
94
|
/**
|
|
92
95
|
* Retrieve a single resource matching the given ID, skipping any service-level hooks.
|
|
@@ -97,7 +100,7 @@ export interface InternalServiceMethods<T = any, D = Partial<T>, P extends Adapt
|
|
|
97
100
|
* @see {@link HookLessServiceMethods}
|
|
98
101
|
* @see {@link https://docs.feathersjs.com/api/services.html#get-id-params|Feathers API Documentation: .get(id, params)}
|
|
99
102
|
*/
|
|
100
|
-
$get(id: Id, params?: P): Promise<T
|
|
103
|
+
$get(id: Id, params?: P): Promise<T>
|
|
101
104
|
|
|
102
105
|
/**
|
|
103
106
|
* Create a new resource for this service, skipping any service-level hooks.
|
|
@@ -108,9 +111,9 @@ export interface InternalServiceMethods<T = any, D = Partial<T>, P extends Adapt
|
|
|
108
111
|
* @see {@link HookLessServiceMethods}
|
|
109
112
|
* @see {@link https://docs.feathersjs.com/api/services.html#create-data-params|Feathers API Documentation: .create(data, params)}
|
|
110
113
|
*/
|
|
111
|
-
$create(data: Partial<D>, params?: P): Promise<T
|
|
112
|
-
$create(data: Partial<D>[], params?: P): Promise<T[]
|
|
113
|
-
$create(data: Partial<D> | Partial<D>[], params?: P): Promise<T | T[]
|
|
114
|
+
$create(data: Partial<D>, params?: P): Promise<T>
|
|
115
|
+
$create(data: Partial<D>[], params?: P): Promise<T[]>
|
|
116
|
+
$create(data: Partial<D> | Partial<D>[], params?: P): Promise<T | T[]>
|
|
114
117
|
|
|
115
118
|
/**
|
|
116
119
|
* Completely replace the resource identified by id, skipping any service-level hooks.
|
|
@@ -122,7 +125,7 @@ export interface InternalServiceMethods<T = any, D = Partial<T>, P extends Adapt
|
|
|
122
125
|
* @see {@link HookLessServiceMethods}
|
|
123
126
|
* @see {@link https://docs.feathersjs.com/api/services.html#update-id-data-params|Feathers API Documentation: .update(id, data, params)}
|
|
124
127
|
*/
|
|
125
|
-
$update(id: Id, data: D, params?: P): Promise<T
|
|
128
|
+
$update(id: Id, data: D, params?: P): Promise<T>
|
|
126
129
|
|
|
127
130
|
/**
|
|
128
131
|
* Merge any resources matching the given ID with the given data, skipping any service-level hooks.
|
|
@@ -134,9 +137,9 @@ export interface InternalServiceMethods<T = any, D = Partial<T>, P extends Adapt
|
|
|
134
137
|
* @see {@link HookLessServiceMethods}
|
|
135
138
|
* @see {@link https://docs.feathersjs.com/api/services.html#patch-id-data-params|Feathers API Documentation: .patch(id, data, params)}
|
|
136
139
|
*/
|
|
137
|
-
$patch(id: null, data: Partial<D>, params?: P): Promise<T[]
|
|
138
|
-
$patch(id: Id, data: Partial<D>, params?: P): Promise<T
|
|
139
|
-
$patch(id: NullableId, data: Partial<D>, params?: P): Promise<T | T[]
|
|
140
|
+
$patch(id: null, data: Partial<D>, params?: P): Promise<T[]>
|
|
141
|
+
$patch(id: Id, data: Partial<D>, params?: P): Promise<T>
|
|
142
|
+
$patch(id: NullableId, data: Partial<D>, params?: P): Promise<T | T[]>
|
|
140
143
|
|
|
141
144
|
/**
|
|
142
145
|
* Remove resources matching the given ID from the this service, skipping any service-level hooks.
|
|
@@ -147,7 +150,7 @@ export interface InternalServiceMethods<T = any, D = Partial<T>, P extends Adapt
|
|
|
147
150
|
* @see {@link HookLessServiceMethods}
|
|
148
151
|
* @see {@link https://docs.feathersjs.com/api/services.html#remove-id-params|Feathers API Documentation: .remove(id, params)}
|
|
149
152
|
*/
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
}
|
|
153
|
+
$remove(id: null, params?: P): Promise<T[]>
|
|
154
|
+
$remove(id: Id, params?: P): Promise<T>
|
|
155
|
+
$remove(id: NullableId, params?: P): Promise<T | T[]>
|
|
156
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -1,29 +1,29 @@
|
|
|
1
|
-
import { _ } from '@feathersjs/commons'
|
|
2
|
-
import { Params } from '@feathersjs/feathers'
|
|
1
|
+
import { _ } from '@feathersjs/commons'
|
|
2
|
+
import { Params } from '@feathersjs/feathers'
|
|
3
3
|
|
|
4
|
-
export * from './declarations'
|
|
5
|
-
export * from './service'
|
|
6
|
-
export { filterQuery, FILTERS, OPERATORS } from './query'
|
|
7
|
-
export * from './sort'
|
|
4
|
+
export * from './declarations'
|
|
5
|
+
export * from './service'
|
|
6
|
+
export { filterQuery, FILTERS, OPERATORS } from './query'
|
|
7
|
+
export * from './sort'
|
|
8
8
|
|
|
9
9
|
// Return a function that filters a result object or array
|
|
10
10
|
// and picks only the fields passed as `params.query.$select`
|
|
11
11
|
// and additional `otherFields`
|
|
12
|
-
export function select
|
|
13
|
-
const queryFields: string[] | undefined = params?.query?.$select
|
|
12
|
+
export function select(params: Params, ...otherFields: string[]) {
|
|
13
|
+
const queryFields: string[] | undefined = params?.query?.$select
|
|
14
14
|
|
|
15
15
|
if (!queryFields) {
|
|
16
|
-
return (result: any) => result
|
|
16
|
+
return (result: any) => result
|
|
17
17
|
}
|
|
18
18
|
|
|
19
|
-
const resultFields = queryFields.concat(otherFields)
|
|
20
|
-
const convert = (result: any) => _.pick(result, ...resultFields)
|
|
19
|
+
const resultFields = queryFields.concat(otherFields)
|
|
20
|
+
const convert = (result: any) => _.pick(result, ...resultFields)
|
|
21
21
|
|
|
22
22
|
return (result: any) => {
|
|
23
23
|
if (Array.isArray(result)) {
|
|
24
|
-
return result.map(convert)
|
|
24
|
+
return result.map(convert)
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
-
return convert(result)
|
|
28
|
-
}
|
|
27
|
+
return convert(result)
|
|
28
|
+
}
|
|
29
29
|
}
|
package/src/query.ts
CHANGED
|
@@ -1,26 +1,26 @@
|
|
|
1
|
-
import { _ } from '@feathersjs/commons'
|
|
2
|
-
import { BadRequest } from '@feathersjs/errors'
|
|
3
|
-
import { Query } from '@feathersjs/feathers'
|
|
4
|
-
import { FilterQueryOptions, FilterSettings } from './declarations'
|
|
1
|
+
import { _ } from '@feathersjs/commons'
|
|
2
|
+
import { BadRequest } from '@feathersjs/errors'
|
|
3
|
+
import { Query } from '@feathersjs/feathers'
|
|
4
|
+
import { FilterQueryOptions, FilterSettings } from './declarations'
|
|
5
5
|
|
|
6
|
-
const parse = (value: any) => typeof value !== 'undefined' ? parseInt(value, 10) : value
|
|
6
|
+
const parse = (value: any) => (typeof value !== 'undefined' ? parseInt(value, 10) : value)
|
|
7
7
|
|
|
8
|
-
const isPlainObject = (value: any) => _.isObject(value) && value.constructor === {}.constructor
|
|
8
|
+
const isPlainObject = (value: any) => _.isObject(value) && value.constructor === {}.constructor
|
|
9
9
|
|
|
10
10
|
const validateQueryProperty = (query: any, operators: string[] = []): Query => {
|
|
11
11
|
if (!isPlainObject(query)) {
|
|
12
|
-
return query
|
|
12
|
+
return query
|
|
13
13
|
}
|
|
14
14
|
|
|
15
15
|
for (const key of Object.keys(query)) {
|
|
16
16
|
if (key.startsWith('$') && !operators.includes(key)) {
|
|
17
|
-
throw new BadRequest(`Invalid query parameter ${key}`, query)
|
|
17
|
+
throw new BadRequest(`Invalid query parameter ${key}`, query)
|
|
18
18
|
}
|
|
19
19
|
|
|
20
|
-
const value = query[key]
|
|
20
|
+
const value = query[key]
|
|
21
21
|
|
|
22
22
|
if (isPlainObject(value)) {
|
|
23
|
-
query[key] = validateQueryProperty(value, operators)
|
|
23
|
+
query[key] = validateQueryProperty(value, operators)
|
|
24
24
|
}
|
|
25
25
|
}
|
|
26
26
|
|
|
@@ -30,82 +30,81 @@ const validateQueryProperty = (query: any, operators: string[] = []): Query => {
|
|
|
30
30
|
}
|
|
31
31
|
|
|
32
32
|
const getFilters = (query: Query, settings: FilterQueryOptions) => {
|
|
33
|
-
const filterNames = Object.keys(settings.filters)
|
|
33
|
+
const filterNames = Object.keys(settings.filters)
|
|
34
34
|
|
|
35
35
|
return filterNames.reduce((current, key) => {
|
|
36
|
-
const queryValue = query[key]
|
|
37
|
-
const filter = settings.filters[key]
|
|
36
|
+
const queryValue = query[key]
|
|
37
|
+
const filter = settings.filters[key]
|
|
38
38
|
|
|
39
39
|
if (filter) {
|
|
40
|
-
const value = typeof filter === 'function' ? filter(queryValue, settings) : queryValue
|
|
40
|
+
const value = typeof filter === 'function' ? filter(queryValue, settings) : queryValue
|
|
41
41
|
|
|
42
42
|
if (value !== undefined) {
|
|
43
|
-
current[key] = value
|
|
43
|
+
current[key] = value
|
|
44
44
|
}
|
|
45
45
|
}
|
|
46
46
|
|
|
47
|
-
return current
|
|
48
|
-
}, {} as { [key: string]: any })
|
|
47
|
+
return current
|
|
48
|
+
}, {} as { [key: string]: any })
|
|
49
49
|
}
|
|
50
50
|
|
|
51
51
|
const getQuery = (query: Query, settings: FilterQueryOptions) => {
|
|
52
|
-
const keys = Object.keys(query).concat(Object.getOwnPropertySymbols(query) as any as string[])
|
|
52
|
+
const keys = Object.keys(query).concat(Object.getOwnPropertySymbols(query) as any as string[])
|
|
53
53
|
|
|
54
54
|
return keys.reduce((result, key) => {
|
|
55
55
|
if (typeof key === 'string' && key.startsWith('$')) {
|
|
56
56
|
if (settings.filters[key] === undefined) {
|
|
57
|
-
throw new BadRequest(`Invalid filter value ${key}`)
|
|
57
|
+
throw new BadRequest(`Invalid filter value ${key}`)
|
|
58
58
|
}
|
|
59
59
|
} else {
|
|
60
|
-
result[key] = validateQueryProperty(query[key], settings.operators)
|
|
60
|
+
result[key] = validateQueryProperty(query[key], settings.operators)
|
|
61
61
|
}
|
|
62
62
|
|
|
63
|
-
return result
|
|
63
|
+
return result
|
|
64
64
|
}, {} as Query)
|
|
65
65
|
}
|
|
66
66
|
|
|
67
|
-
export const OPERATORS = ['$in', '$nin', '$lt', '$lte', '$gt', '$gte', '$ne', '$or']
|
|
67
|
+
export const OPERATORS = ['$in', '$nin', '$lt', '$lte', '$gt', '$gte', '$ne', '$or']
|
|
68
68
|
|
|
69
69
|
export const FILTERS: FilterSettings = {
|
|
70
70
|
$skip: (value: any) => parse(value),
|
|
71
71
|
$sort: (sort: any): { [key: string]: number } => {
|
|
72
72
|
if (typeof sort !== 'object' || Array.isArray(sort)) {
|
|
73
|
-
return sort
|
|
73
|
+
return sort
|
|
74
74
|
}
|
|
75
75
|
|
|
76
76
|
return Object.keys(sort).reduce((result, key) => {
|
|
77
|
-
result[key] = typeof sort[key] === 'object'
|
|
78
|
-
? sort[key] : parse(sort[key]);
|
|
77
|
+
result[key] = typeof sort[key] === 'object' ? sort[key] : parse(sort[key])
|
|
79
78
|
|
|
80
|
-
return result
|
|
81
|
-
}, {} as { [key: string]: number })
|
|
79
|
+
return result
|
|
80
|
+
}, {} as { [key: string]: number })
|
|
82
81
|
},
|
|
83
82
|
$limit: (_limit: any, { paginate }: FilterQueryOptions) => {
|
|
84
|
-
const limit = parse(_limit)
|
|
83
|
+
const limit = parse(_limit)
|
|
85
84
|
|
|
86
85
|
if (paginate && (paginate.default || paginate.max)) {
|
|
87
|
-
const base = paginate.default || 0
|
|
88
|
-
const lower = typeof limit === 'number' && !isNaN(limit) && limit >= 0 ? limit : base
|
|
89
|
-
const upper = typeof paginate.max === 'number' ? paginate.max : Number.MAX_VALUE
|
|
86
|
+
const base = paginate.default || 0
|
|
87
|
+
const lower = typeof limit === 'number' && !isNaN(limit) && limit >= 0 ? limit : base
|
|
88
|
+
const upper = typeof paginate.max === 'number' ? paginate.max : Number.MAX_VALUE
|
|
90
89
|
|
|
91
|
-
return Math.min(lower, upper)
|
|
90
|
+
return Math.min(lower, upper)
|
|
92
91
|
}
|
|
93
92
|
|
|
94
|
-
return limit
|
|
93
|
+
return limit
|
|
95
94
|
},
|
|
96
95
|
$select: (select: any) => {
|
|
97
96
|
if (Array.isArray(select)) {
|
|
98
|
-
return select.map(current => `${current}`)
|
|
97
|
+
return select.map((current) => `${current}`)
|
|
99
98
|
}
|
|
100
99
|
|
|
101
|
-
return select
|
|
100
|
+
return select
|
|
102
101
|
},
|
|
103
102
|
$or: (or: any, { operators }: FilterQueryOptions) => {
|
|
104
103
|
if (Array.isArray(or)) {
|
|
105
|
-
return or.map(current => validateQueryProperty(current, operators))
|
|
104
|
+
return or.map((current) => validateQueryProperty(current, operators))
|
|
106
105
|
}
|
|
107
106
|
|
|
108
|
-
return or
|
|
107
|
+
return or
|
|
109
108
|
}
|
|
110
109
|
}
|
|
111
110
|
|
|
@@ -120,8 +119,8 @@ export const FILTERS: FilterSettings = {
|
|
|
120
119
|
* @returns An object with `query` which contains the query without `filters`
|
|
121
120
|
* and `filters` which contains the converted values for each filter.
|
|
122
121
|
*/
|
|
123
|
-
export function filterQuery
|
|
124
|
-
const query = _query || {}
|
|
122
|
+
export function filterQuery(_query: Query, options: FilterQueryOptions = {}) {
|
|
123
|
+
const query = _query || {}
|
|
125
124
|
const settings = {
|
|
126
125
|
...options,
|
|
127
126
|
filters: {
|
package/src/service.ts
CHANGED
|
@@ -1,13 +1,18 @@
|
|
|
1
|
-
import { BadRequest, MethodNotAllowed } from '@feathersjs/errors'
|
|
2
|
-
import { Id, NullableId, Paginated, Query } from '@feathersjs/feathers'
|
|
3
|
-
import {
|
|
4
|
-
|
|
1
|
+
import { BadRequest, MethodNotAllowed } from '@feathersjs/errors'
|
|
2
|
+
import { Id, NullableId, Paginated, Query } from '@feathersjs/feathers'
|
|
3
|
+
import {
|
|
4
|
+
AdapterParams,
|
|
5
|
+
AdapterServiceOptions,
|
|
6
|
+
InternalServiceMethods,
|
|
7
|
+
PaginationOptions
|
|
8
|
+
} from './declarations'
|
|
9
|
+
import { filterQuery } from './query'
|
|
5
10
|
|
|
6
11
|
const alwaysMulti: { [key: string]: boolean } = {
|
|
7
12
|
find: true,
|
|
8
13
|
get: false,
|
|
9
14
|
update: false
|
|
10
|
-
}
|
|
15
|
+
}
|
|
11
16
|
|
|
12
17
|
/**
|
|
13
18
|
* An abstract base class that a database adapter can extend from to implement the
|
|
@@ -18,10 +23,11 @@ export abstract class AdapterBase<
|
|
|
18
23
|
D = Partial<T>,
|
|
19
24
|
P extends AdapterParams = AdapterParams,
|
|
20
25
|
O extends AdapterServiceOptions = AdapterServiceOptions
|
|
21
|
-
> implements InternalServiceMethods<T, D, P>
|
|
22
|
-
|
|
26
|
+
> implements InternalServiceMethods<T, D, P>
|
|
27
|
+
{
|
|
28
|
+
options: O
|
|
23
29
|
|
|
24
|
-
constructor
|
|
30
|
+
constructor(options: O) {
|
|
25
31
|
this.options = {
|
|
26
32
|
id: 'id',
|
|
27
33
|
events: [],
|
|
@@ -30,15 +36,15 @@ export abstract class AdapterBase<
|
|
|
30
36
|
filters: {},
|
|
31
37
|
operators: [],
|
|
32
38
|
...options
|
|
33
|
-
}
|
|
39
|
+
}
|
|
34
40
|
}
|
|
35
41
|
|
|
36
|
-
get id
|
|
37
|
-
return this.options.id
|
|
42
|
+
get id() {
|
|
43
|
+
return this.options.id
|
|
38
44
|
}
|
|
39
45
|
|
|
40
|
-
get events
|
|
41
|
-
return this.options.events
|
|
46
|
+
get events() {
|
|
47
|
+
return this.options.events
|
|
42
48
|
}
|
|
43
49
|
|
|
44
50
|
/**
|
|
@@ -47,20 +53,20 @@ export abstract class AdapterBase<
|
|
|
47
53
|
* @param params The service call params.
|
|
48
54
|
* @returns Wether or not multiple updates are allowed.
|
|
49
55
|
*/
|
|
50
|
-
|
|
51
|
-
const always = alwaysMulti[method]
|
|
56
|
+
allowsMulti(method: string, params: P = {} as P) {
|
|
57
|
+
const always = alwaysMulti[method]
|
|
52
58
|
|
|
53
59
|
if (typeof always !== 'undefined') {
|
|
54
|
-
return always
|
|
60
|
+
return always
|
|
55
61
|
}
|
|
56
62
|
|
|
57
|
-
const { multi } = this.getOptions(params)
|
|
63
|
+
const { multi } = this.getOptions(params)
|
|
58
64
|
|
|
59
65
|
if (multi === true || multi === false) {
|
|
60
|
-
return multi
|
|
66
|
+
return multi
|
|
61
67
|
}
|
|
62
68
|
|
|
63
|
-
return multi.includes(method)
|
|
69
|
+
return multi.includes(method)
|
|
64
70
|
}
|
|
65
71
|
|
|
66
72
|
/**
|
|
@@ -70,8 +76,8 @@ export abstract class AdapterBase<
|
|
|
70
76
|
* @param params The parameters for the service method call
|
|
71
77
|
* @returns The actual options for this call
|
|
72
78
|
*/
|
|
73
|
-
getOptions
|
|
74
|
-
const paginate = params.paginate !== undefined ? params.paginate : this.options.paginate
|
|
79
|
+
getOptions(params: P): O {
|
|
80
|
+
const paginate = params.paginate !== undefined ? params.paginate : this.options.paginate
|
|
75
81
|
|
|
76
82
|
return {
|
|
77
83
|
...this.options,
|
|
@@ -87,8 +93,8 @@ export abstract class AdapterBase<
|
|
|
87
93
|
* @param _params Service call parameters
|
|
88
94
|
* @returns The sanitized data
|
|
89
95
|
*/
|
|
90
|
-
async sanitizeData<X = Partial<D>>
|
|
91
|
-
return data
|
|
96
|
+
async sanitizeData<X = Partial<D>>(data: X, _params: P) {
|
|
97
|
+
return data
|
|
92
98
|
}
|
|
93
99
|
|
|
94
100
|
/**
|
|
@@ -100,19 +106,19 @@ export abstract class AdapterBase<
|
|
|
100
106
|
* @param params The service call parameter.
|
|
101
107
|
* @returns A new object containing the sanitized query.
|
|
102
108
|
*/
|
|
103
|
-
async sanitizeQuery
|
|
104
|
-
const options = this.getOptions(params)
|
|
109
|
+
async sanitizeQuery(params: P = {} as P): Promise<Query> {
|
|
110
|
+
const options = this.getOptions(params)
|
|
105
111
|
const { query, filters } = filterQuery(params.query, options)
|
|
106
112
|
|
|
107
113
|
return {
|
|
108
114
|
...filters,
|
|
109
115
|
...query
|
|
110
|
-
}
|
|
116
|
+
}
|
|
111
117
|
}
|
|
112
118
|
|
|
113
|
-
abstract $find(_params?: P & { paginate?: PaginationOptions }): Promise<Paginated<T
|
|
114
|
-
abstract $find(_params?: P & { paginate: false }): Promise<T[]
|
|
115
|
-
abstract $find(params?: P): Promise<T[] | Paginated<T
|
|
119
|
+
abstract $find(_params?: P & { paginate?: PaginationOptions }): Promise<Paginated<T>>
|
|
120
|
+
abstract $find(_params?: P & { paginate: false }): Promise<T[]>
|
|
121
|
+
abstract $find(params?: P): Promise<T[] | Paginated<T>>
|
|
116
122
|
|
|
117
123
|
/**
|
|
118
124
|
* Retrieve all resources from this service, skipping any service-level hooks but sanitize the query
|
|
@@ -122,19 +128,19 @@ export abstract class AdapterBase<
|
|
|
122
128
|
* @see {@link HookLessServiceMethods}
|
|
123
129
|
* @see {@link https://docs.feathersjs.com/api/services.html#find-params|Feathers API Documentation: .find(params)}
|
|
124
130
|
*/
|
|
125
|
-
async _find(_params?: P & { paginate?: PaginationOptions }): Promise<Paginated<T
|
|
126
|
-
async _find(_params?: P & { paginate: false }): Promise<T[]
|
|
127
|
-
async _find(params?: P): Promise<T | T[] | Paginated<T
|
|
128
|
-
async _find
|
|
129
|
-
const query = await this.sanitizeQuery(params)
|
|
131
|
+
async _find(_params?: P & { paginate?: PaginationOptions }): Promise<Paginated<T>>
|
|
132
|
+
async _find(_params?: P & { paginate: false }): Promise<T[]>
|
|
133
|
+
async _find(params?: P): Promise<T | T[] | Paginated<T>>
|
|
134
|
+
async _find(params?: P): Promise<T | T[] | Paginated<T>> {
|
|
135
|
+
const query = await this.sanitizeQuery(params)
|
|
130
136
|
|
|
131
137
|
return this.$find({
|
|
132
138
|
...params,
|
|
133
139
|
query
|
|
134
|
-
})
|
|
140
|
+
})
|
|
135
141
|
}
|
|
136
142
|
|
|
137
|
-
abstract $get(id: Id, params?: P): Promise<T
|
|
143
|
+
abstract $get(id: Id, params?: P): Promise<T>
|
|
138
144
|
|
|
139
145
|
/**
|
|
140
146
|
* Retrieve a single resource matching the given ID, skipping any service-level hooks but sanitize the query
|
|
@@ -145,18 +151,18 @@ export abstract class AdapterBase<
|
|
|
145
151
|
* @see {@link HookLessServiceMethods}
|
|
146
152
|
* @see {@link https://docs.feathersjs.com/api/services.html#get-id-params|Feathers API Documentation: .get(id, params)}
|
|
147
153
|
*/
|
|
148
|
-
async _get
|
|
149
|
-
const query = await this.sanitizeQuery(params)
|
|
154
|
+
async _get(id: Id, params?: P): Promise<T> {
|
|
155
|
+
const query = await this.sanitizeQuery(params)
|
|
150
156
|
|
|
151
157
|
return this.$get(id, {
|
|
152
158
|
...params,
|
|
153
159
|
query
|
|
154
|
-
})
|
|
160
|
+
})
|
|
155
161
|
}
|
|
156
162
|
|
|
157
|
-
abstract $create(data: Partial<D>, params?: P): Promise<T
|
|
158
|
-
abstract $create(data: Partial<D>[], params?: P): Promise<T[]
|
|
159
|
-
abstract $create(data: Partial<D> | Partial<D>[], params?: P): Promise<T | T[]
|
|
163
|
+
abstract $create(data: Partial<D>, params?: P): Promise<T>
|
|
164
|
+
abstract $create(data: Partial<D>[], params?: P): Promise<T[]>
|
|
165
|
+
abstract $create(data: Partial<D> | Partial<D>[], params?: P): Promise<T | T[]>
|
|
160
166
|
|
|
161
167
|
/**
|
|
162
168
|
* Create a new resource for this service, skipping any service-level hooks, sanitize the data
|
|
@@ -167,22 +173,22 @@ export abstract class AdapterBase<
|
|
|
167
173
|
* @see {@link HookLessServiceMethods}
|
|
168
174
|
* @see {@link https://docs.feathersjs.com/api/services.html#create-data-params|Feathers API Documentation: .create(data, params)}
|
|
169
175
|
*/
|
|
170
|
-
async _create(data: Partial<D>, params?: P): Promise<T
|
|
171
|
-
async _create(data: Partial<D>[], params?: P): Promise<T[]
|
|
172
|
-
async _create(data: Partial<D> | Partial<D>[], params?: P): Promise<T | T[]
|
|
173
|
-
async _create
|
|
176
|
+
async _create(data: Partial<D>, params?: P): Promise<T>
|
|
177
|
+
async _create(data: Partial<D>[], params?: P): Promise<T[]>
|
|
178
|
+
async _create(data: Partial<D> | Partial<D>[], params?: P): Promise<T | T[]>
|
|
179
|
+
async _create(data: Partial<D> | Partial<D>[], params?: P): Promise<T | T[]> {
|
|
174
180
|
if (Array.isArray(data) && !this.allowsMulti('create', params)) {
|
|
175
|
-
throw new MethodNotAllowed('Can not create multiple entries')
|
|
181
|
+
throw new MethodNotAllowed('Can not create multiple entries')
|
|
176
182
|
}
|
|
177
183
|
|
|
178
184
|
const payload = Array.isArray(data)
|
|
179
|
-
?
|
|
180
|
-
:
|
|
185
|
+
? await Promise.all(data.map((current) => this.sanitizeData(current, params)))
|
|
186
|
+
: await this.sanitizeData(data, params)
|
|
181
187
|
|
|
182
|
-
return this.$create(payload, params)
|
|
188
|
+
return this.$create(payload, params)
|
|
183
189
|
}
|
|
184
190
|
|
|
185
|
-
abstract $update(id: Id, data: D, params?: P): Promise<T
|
|
191
|
+
abstract $update(id: Id, data: D, params?: P): Promise<T>
|
|
186
192
|
|
|
187
193
|
/**
|
|
188
194
|
* Replace any resources matching the given ID with the given data, skipping any service-level hooks.
|
|
@@ -193,25 +199,23 @@ export abstract class AdapterBase<
|
|
|
193
199
|
* @see {@link HookLessServiceMethods}
|
|
194
200
|
* @see {@link https://docs.feathersjs.com/api/services.html#update-id-data-params|Feathers API Documentation: .update(id, data, params)}
|
|
195
201
|
*/
|
|
196
|
-
async _update
|
|
202
|
+
async _update(id: Id, data: D, params?: P): Promise<T> {
|
|
197
203
|
if (id === null || Array.isArray(data)) {
|
|
198
|
-
throw new BadRequest(
|
|
199
|
-
'You can not replace multiple instances. Did you mean \'patch\'?'
|
|
200
|
-
);
|
|
204
|
+
throw new BadRequest("You can not replace multiple instances. Did you mean 'patch'?")
|
|
201
205
|
}
|
|
202
206
|
|
|
203
|
-
const payload = await this.sanitizeData(data, params)
|
|
204
|
-
const query = await this.sanitizeQuery(params)
|
|
207
|
+
const payload = await this.sanitizeData(data, params)
|
|
208
|
+
const query = await this.sanitizeQuery(params)
|
|
205
209
|
|
|
206
210
|
return this.$update(id, payload, {
|
|
207
211
|
...params,
|
|
208
212
|
query
|
|
209
|
-
})
|
|
213
|
+
})
|
|
210
214
|
}
|
|
211
215
|
|
|
212
|
-
abstract $patch(id: null, data: Partial<D>, params?: P): Promise<T[]
|
|
213
|
-
abstract $patch(id: Id, data: Partial<D>, params?: P): Promise<T
|
|
214
|
-
abstract $patch(id: NullableId, data: Partial<D>, params?: P): Promise<T | T[]
|
|
216
|
+
abstract $patch(id: null, data: Partial<D>, params?: P): Promise<T[]>
|
|
217
|
+
abstract $patch(id: Id, data: Partial<D>, params?: P): Promise<T>
|
|
218
|
+
abstract $patch(id: NullableId, data: Partial<D>, params?: P): Promise<T | T[]>
|
|
215
219
|
|
|
216
220
|
/**
|
|
217
221
|
* Merge any resources matching the given ID with the given data, skipping any service-level hooks.
|
|
@@ -223,26 +227,26 @@ export abstract class AdapterBase<
|
|
|
223
227
|
* @see {@link HookLessServiceMethods}
|
|
224
228
|
* @see {@link https://docs.feathersjs.com/api/services.html#patch-id-data-params|Feathers API Documentation: .patch(id, data, params)}
|
|
225
229
|
*/
|
|
226
|
-
async _patch(id: null, data: Partial<D>, params?: P): Promise<T[]
|
|
227
|
-
async _patch(id: Id, data: Partial<D>, params?: P): Promise<T
|
|
228
|
-
async _patch(id: NullableId, data: Partial<D>, params?: P): Promise<T | T[]
|
|
229
|
-
async _patch
|
|
230
|
+
async _patch(id: null, data: Partial<D>, params?: P): Promise<T[]>
|
|
231
|
+
async _patch(id: Id, data: Partial<D>, params?: P): Promise<T>
|
|
232
|
+
async _patch(id: NullableId, data: Partial<D>, params?: P): Promise<T | T[]>
|
|
233
|
+
async _patch(id: NullableId, data: Partial<D>, params?: P): Promise<T | T[]> {
|
|
230
234
|
if (id === null && !this.allowsMulti('patch', params)) {
|
|
231
|
-
throw new MethodNotAllowed('Can not patch multiple entries')
|
|
235
|
+
throw new MethodNotAllowed('Can not patch multiple entries')
|
|
232
236
|
}
|
|
233
237
|
|
|
234
|
-
const query = await this.sanitizeQuery(params)
|
|
235
|
-
const payload = await this.sanitizeData(data, params)
|
|
238
|
+
const { $limit, ...query } = await this.sanitizeQuery(params)
|
|
239
|
+
const payload = await this.sanitizeData(data, params)
|
|
236
240
|
|
|
237
241
|
return this.$patch(id, payload, {
|
|
238
242
|
...params,
|
|
239
243
|
query
|
|
240
|
-
})
|
|
244
|
+
})
|
|
241
245
|
}
|
|
242
246
|
|
|
243
|
-
abstract $remove(id: null, params?: P): Promise<T[]
|
|
244
|
-
abstract $remove(id: Id, params?: P): Promise<T
|
|
245
|
-
abstract $remove(id: NullableId, params?: P): Promise<T | T[]
|
|
247
|
+
abstract $remove(id: null, params?: P): Promise<T[]>
|
|
248
|
+
abstract $remove(id: Id, params?: P): Promise<T>
|
|
249
|
+
abstract $remove(id: NullableId, params?: P): Promise<T | T[]>
|
|
246
250
|
|
|
247
251
|
/**
|
|
248
252
|
* Remove resources matching the given ID from the this service, skipping any service-level hooks.
|
|
@@ -253,19 +257,19 @@ export abstract class AdapterBase<
|
|
|
253
257
|
* @see {@link HookLessServiceMethods}
|
|
254
258
|
* @see {@link https://docs.feathersjs.com/api/services.html#remove-id-params|Feathers API Documentation: .remove(id, params)}
|
|
255
259
|
*/
|
|
256
|
-
async _remove(id: null, params?: P): Promise<T[]
|
|
257
|
-
async _remove(id: Id, params?: P): Promise<T
|
|
258
|
-
async _remove(id: NullableId, params?: P): Promise<T | T[]
|
|
259
|
-
async _remove
|
|
260
|
+
async _remove(id: null, params?: P): Promise<T[]>
|
|
261
|
+
async _remove(id: Id, params?: P): Promise<T>
|
|
262
|
+
async _remove(id: NullableId, params?: P): Promise<T | T[]>
|
|
263
|
+
async _remove(id: NullableId, params?: P): Promise<T | T[]> {
|
|
260
264
|
if (id === null && !this.allowsMulti('remove', params)) {
|
|
261
|
-
throw new MethodNotAllowed('Can not remove multiple entries')
|
|
265
|
+
throw new MethodNotAllowed('Can not remove multiple entries')
|
|
262
266
|
}
|
|
263
267
|
|
|
264
|
-
const query = await this.sanitizeQuery(params)
|
|
268
|
+
const { $limit, ...query } = await this.sanitizeQuery(params)
|
|
265
269
|
|
|
266
270
|
return this.$remove(id, {
|
|
267
271
|
...params,
|
|
268
272
|
query
|
|
269
|
-
})
|
|
273
|
+
})
|
|
270
274
|
}
|
|
271
275
|
}
|
package/src/sort.ts
CHANGED
|
@@ -1,90 +1,130 @@
|
|
|
1
1
|
// Sorting algorithm taken from NeDB (https://github.com/louischatriot/nedb)
|
|
2
2
|
// See https://github.com/louischatriot/nedb/blob/e3f0078499aa1005a59d0c2372e425ab789145c1/lib/model.js#L189
|
|
3
3
|
|
|
4
|
-
export function compareNSB
|
|
5
|
-
if (a < b) {
|
|
6
|
-
|
|
7
|
-
|
|
4
|
+
export function compareNSB(a: any, b: any) {
|
|
5
|
+
if (a < b) {
|
|
6
|
+
return -1
|
|
7
|
+
}
|
|
8
|
+
if (a > b) {
|
|
9
|
+
return 1
|
|
10
|
+
}
|
|
11
|
+
return 0
|
|
8
12
|
}
|
|
9
13
|
|
|
10
|
-
export function compareArrays
|
|
14
|
+
export function compareArrays(a: any[], b: any[]) {
|
|
11
15
|
for (let i = 0, l = Math.min(a.length, b.length); i < l; i++) {
|
|
12
|
-
const comparison = compare(a[i], b[i])
|
|
16
|
+
const comparison = compare(a[i], b[i])
|
|
13
17
|
|
|
14
|
-
if (comparison !== 0) {
|
|
18
|
+
if (comparison !== 0) {
|
|
19
|
+
return comparison
|
|
20
|
+
}
|
|
15
21
|
}
|
|
16
22
|
|
|
17
23
|
// Common section was identical, longest one wins
|
|
18
|
-
return compareNSB(a.length, b.length)
|
|
24
|
+
return compareNSB(a.length, b.length)
|
|
19
25
|
}
|
|
20
26
|
|
|
21
|
-
export function compare
|
|
22
|
-
if (a === b) {
|
|
27
|
+
export function compare(a: any, b: any, compareStrings: any = compareNSB): 0 | 1 | -1 {
|
|
28
|
+
if (a === b) {
|
|
29
|
+
return 0
|
|
30
|
+
}
|
|
23
31
|
|
|
24
32
|
// undefined
|
|
25
|
-
if (a === undefined) {
|
|
26
|
-
|
|
33
|
+
if (a === undefined) {
|
|
34
|
+
return -1
|
|
35
|
+
}
|
|
36
|
+
if (b === undefined) {
|
|
37
|
+
return 1
|
|
38
|
+
}
|
|
27
39
|
|
|
28
40
|
// null
|
|
29
|
-
if (a === null) {
|
|
30
|
-
|
|
41
|
+
if (a === null) {
|
|
42
|
+
return -1
|
|
43
|
+
}
|
|
44
|
+
if (b === null) {
|
|
45
|
+
return 1
|
|
46
|
+
}
|
|
31
47
|
|
|
32
48
|
// Numbers
|
|
33
|
-
if (typeof a === 'number') {
|
|
34
|
-
|
|
49
|
+
if (typeof a === 'number') {
|
|
50
|
+
return typeof b === 'number' ? compareNSB(a, b) : -1
|
|
51
|
+
}
|
|
52
|
+
if (typeof b === 'number') {
|
|
53
|
+
return 1
|
|
54
|
+
}
|
|
35
55
|
|
|
36
56
|
// Strings
|
|
37
|
-
if (typeof a === 'string') {
|
|
38
|
-
|
|
57
|
+
if (typeof a === 'string') {
|
|
58
|
+
return typeof b === 'string' ? compareStrings(a, b) : -1
|
|
59
|
+
}
|
|
60
|
+
if (typeof b === 'string') {
|
|
61
|
+
return 1
|
|
62
|
+
}
|
|
39
63
|
|
|
40
64
|
// Booleans
|
|
41
|
-
if (typeof a === 'boolean') {
|
|
42
|
-
|
|
65
|
+
if (typeof a === 'boolean') {
|
|
66
|
+
return typeof b === 'boolean' ? compareNSB(a, b) : -1
|
|
67
|
+
}
|
|
68
|
+
if (typeof b === 'boolean') {
|
|
69
|
+
return 1
|
|
70
|
+
}
|
|
43
71
|
|
|
44
72
|
// Dates
|
|
45
|
-
if (a instanceof Date) {
|
|
46
|
-
|
|
73
|
+
if (a instanceof Date) {
|
|
74
|
+
return b instanceof Date ? compareNSB(a.getTime(), b.getTime()) : -1
|
|
75
|
+
}
|
|
76
|
+
if (b instanceof Date) {
|
|
77
|
+
return 1
|
|
78
|
+
}
|
|
47
79
|
|
|
48
80
|
// Arrays (first element is most significant and so on)
|
|
49
|
-
if (Array.isArray(a)) {
|
|
50
|
-
|
|
81
|
+
if (Array.isArray(a)) {
|
|
82
|
+
return Array.isArray(b) ? compareArrays(a, b) : -1
|
|
83
|
+
}
|
|
84
|
+
if (Array.isArray(b)) {
|
|
85
|
+
return 1
|
|
86
|
+
}
|
|
51
87
|
|
|
52
88
|
// Objects
|
|
53
|
-
const aKeys = Object.keys(a).sort()
|
|
54
|
-
const bKeys = Object.keys(b).sort()
|
|
89
|
+
const aKeys = Object.keys(a).sort()
|
|
90
|
+
const bKeys = Object.keys(b).sort()
|
|
55
91
|
|
|
56
92
|
for (let i = 0, l = Math.min(aKeys.length, bKeys.length); i < l; i++) {
|
|
57
|
-
const comparison = compare(a[aKeys[i]], b[bKeys[i]])
|
|
93
|
+
const comparison = compare(a[aKeys[i]], b[bKeys[i]])
|
|
58
94
|
|
|
59
|
-
if (comparison !== 0) {
|
|
95
|
+
if (comparison !== 0) {
|
|
96
|
+
return comparison
|
|
97
|
+
}
|
|
60
98
|
}
|
|
61
99
|
|
|
62
|
-
return compareNSB(aKeys.length, bKeys.length)
|
|
100
|
+
return compareNSB(aKeys.length, bKeys.length)
|
|
63
101
|
}
|
|
64
102
|
|
|
65
103
|
// An in-memory sorting function according to the
|
|
66
104
|
// $sort special query parameter
|
|
67
|
-
export function sorter
|
|
68
|
-
const get = (value: any, path: string[]) => path.reduce((value, key) => value[key], value)
|
|
105
|
+
export function sorter($sort: { [key: string]: -1 | 1 }) {
|
|
106
|
+
const get = (value: any, path: string[]) => path.reduce((value, key) => value[key], value)
|
|
69
107
|
|
|
70
|
-
const compares = Object.keys($sort).map(key => {
|
|
71
|
-
const direction = $sort[key]
|
|
72
|
-
const path = key.split('.')
|
|
108
|
+
const compares = Object.keys($sort).map((key) => {
|
|
109
|
+
const direction = $sort[key]
|
|
110
|
+
const path = key.split('.')
|
|
73
111
|
|
|
74
112
|
if (path.length === 1) {
|
|
75
|
-
return (a: any, b: any) => direction * compare(a[key], b[key])
|
|
113
|
+
return (a: any, b: any) => direction * compare(a[key], b[key])
|
|
76
114
|
} else {
|
|
77
|
-
return (a: any, b: any) => direction * compare(get(a, path), get(b, path))
|
|
115
|
+
return (a: any, b: any) => direction * compare(get(a, path), get(b, path))
|
|
78
116
|
}
|
|
79
|
-
})
|
|
117
|
+
})
|
|
80
118
|
|
|
81
119
|
return function (a: any, b: any) {
|
|
82
120
|
for (const compare of compares) {
|
|
83
|
-
const comparasion = compare(a, b)
|
|
121
|
+
const comparasion = compare(a, b)
|
|
84
122
|
|
|
85
|
-
if (comparasion !== 0) {
|
|
123
|
+
if (comparasion !== 0) {
|
|
124
|
+
return comparasion
|
|
125
|
+
}
|
|
86
126
|
}
|
|
87
127
|
|
|
88
|
-
return 0
|
|
89
|
-
}
|
|
128
|
+
return 0
|
|
129
|
+
}
|
|
90
130
|
}
|