@feathersjs/adapter-commons 5.0.0-pre.9 → 5.0.0
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 +172 -250
- package/LICENSE +1 -1
- package/README.md +2 -3
- package/lib/declarations.d.ts +150 -0
- package/lib/declarations.js +3 -0
- package/lib/declarations.js.map +1 -0
- package/lib/index.d.ts +5 -3
- package/lib/index.js +15 -17
- package/lib/index.js.map +1 -1
- package/lib/query.d.ts +28 -0
- package/lib/query.js +129 -0
- package/lib/query.js.map +1 -0
- package/lib/service.d.ts +67 -73
- package/lib/service.js +57 -74
- package/lib/service.js.map +1 -1
- package/lib/sort.d.ts +5 -3
- package/lib/sort.js +35 -47
- package/lib/sort.js.map +1 -1
- package/package.json +16 -14
- package/src/declarations.ts +166 -0
- package/src/index.ts +15 -18
- package/src/query.ts +152 -0
- package/src/service.ts +132 -175
- package/src/sort.ts +86 -66
- package/lib/filter-query.d.ts +0 -10
- package/lib/filter-query.js +0 -96
- package/lib/filter-query.js.map +0 -1
- package/src/filter-query.ts +0 -116
package/src/sort.ts
CHANGED
|
@@ -1,110 +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
|
|
11
|
-
let i;
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
for (i = 0; i < Math.min(a.length, b.length); i += 1) {
|
|
15
|
-
comp = exports.compare(a[i], b[i]);
|
|
14
|
+
export function compareArrays(a: any[], b: any[]) {
|
|
15
|
+
for (let i = 0, l = Math.min(a.length, b.length); i < l; i++) {
|
|
16
|
+
const comparison = compare(a[i], b[i])
|
|
16
17
|
|
|
17
|
-
if (
|
|
18
|
+
if (comparison !== 0) {
|
|
19
|
+
return comparison
|
|
20
|
+
}
|
|
18
21
|
}
|
|
19
22
|
|
|
20
23
|
// Common section was identical, longest one wins
|
|
21
|
-
return
|
|
24
|
+
return compareNSB(a.length, b.length)
|
|
22
25
|
}
|
|
23
26
|
|
|
24
|
-
export function compare
|
|
25
|
-
|
|
27
|
+
export function compare(a: any, b: any, compareStrings: any = compareNSB): 0 | 1 | -1 {
|
|
28
|
+
if (a === b) {
|
|
29
|
+
return 0
|
|
30
|
+
}
|
|
26
31
|
|
|
27
32
|
// undefined
|
|
28
|
-
if (a === undefined) {
|
|
29
|
-
|
|
33
|
+
if (a === undefined) {
|
|
34
|
+
return -1
|
|
35
|
+
}
|
|
36
|
+
if (b === undefined) {
|
|
37
|
+
return 1
|
|
38
|
+
}
|
|
30
39
|
|
|
31
40
|
// null
|
|
32
|
-
if (a === null) {
|
|
33
|
-
|
|
41
|
+
if (a === null) {
|
|
42
|
+
return -1
|
|
43
|
+
}
|
|
44
|
+
if (b === null) {
|
|
45
|
+
return 1
|
|
46
|
+
}
|
|
34
47
|
|
|
35
48
|
// Numbers
|
|
36
|
-
if (typeof a === 'number') {
|
|
37
|
-
|
|
49
|
+
if (typeof a === 'number') {
|
|
50
|
+
return typeof b === 'number' ? compareNSB(a, b) : -1
|
|
51
|
+
}
|
|
52
|
+
if (typeof b === 'number') {
|
|
53
|
+
return 1
|
|
54
|
+
}
|
|
38
55
|
|
|
39
56
|
// Strings
|
|
40
|
-
if (typeof a === 'string') {
|
|
41
|
-
|
|
57
|
+
if (typeof a === 'string') {
|
|
58
|
+
return typeof b === 'string' ? compareStrings(a, b) : -1
|
|
59
|
+
}
|
|
60
|
+
if (typeof b === 'string') {
|
|
61
|
+
return 1
|
|
62
|
+
}
|
|
42
63
|
|
|
43
64
|
// Booleans
|
|
44
|
-
if (typeof a === 'boolean') {
|
|
45
|
-
|
|
65
|
+
if (typeof a === 'boolean') {
|
|
66
|
+
return typeof b === 'boolean' ? compareNSB(a, b) : -1
|
|
67
|
+
}
|
|
68
|
+
if (typeof b === 'boolean') {
|
|
69
|
+
return 1
|
|
70
|
+
}
|
|
46
71
|
|
|
47
72
|
// Dates
|
|
48
|
-
if (a instanceof Date) {
|
|
49
|
-
|
|
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
|
+
}
|
|
50
79
|
|
|
51
80
|
// Arrays (first element is most significant and so on)
|
|
52
|
-
if (Array.isArray(a)) {
|
|
53
|
-
|
|
81
|
+
if (Array.isArray(a)) {
|
|
82
|
+
return Array.isArray(b) ? compareArrays(a, b) : -1
|
|
83
|
+
}
|
|
84
|
+
if (Array.isArray(b)) {
|
|
85
|
+
return 1
|
|
86
|
+
}
|
|
54
87
|
|
|
55
88
|
// Objects
|
|
56
|
-
const aKeys = Object.keys(a).sort()
|
|
57
|
-
const bKeys = Object.keys(b).sort()
|
|
58
|
-
let comp = 0;
|
|
89
|
+
const aKeys = Object.keys(a).sort()
|
|
90
|
+
const bKeys = Object.keys(b).sort()
|
|
59
91
|
|
|
60
|
-
for (let i = 0
|
|
61
|
-
|
|
92
|
+
for (let i = 0, l = Math.min(aKeys.length, bKeys.length); i < l; i++) {
|
|
93
|
+
const comparison = compare(a[aKeys[i]], b[bKeys[i]])
|
|
62
94
|
|
|
63
|
-
if (
|
|
95
|
+
if (comparison !== 0) {
|
|
96
|
+
return comparison
|
|
97
|
+
}
|
|
64
98
|
}
|
|
65
99
|
|
|
66
|
-
return compareNSB(aKeys.length, bKeys.length)
|
|
100
|
+
return compareNSB(aKeys.length, bKeys.length)
|
|
67
101
|
}
|
|
68
102
|
|
|
69
103
|
// An in-memory sorting function according to the
|
|
70
104
|
// $sort special query parameter
|
|
71
|
-
export function sorter
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
const getVal = (a: any, sortKeys: any[]) => {
|
|
75
|
-
let keys = sortKeys.map(key => key);
|
|
76
|
-
let val = a;
|
|
77
|
-
do {
|
|
78
|
-
let key = keys.shift();
|
|
79
|
-
val = val[key];
|
|
80
|
-
} while (keys.length);
|
|
81
|
-
|
|
82
|
-
return val;
|
|
83
|
-
};
|
|
84
|
-
|
|
85
|
-
const criteria = Object.keys($sort).map(key => {
|
|
86
|
-
const direction = $sort[key];
|
|
87
|
-
const keys = key.split('.');
|
|
88
|
-
sortLevels = keys.length > 1;
|
|
89
|
-
|
|
90
|
-
return { keys, direction };
|
|
91
|
-
});
|
|
105
|
+
export function sorter($sort: { [key: string]: -1 | 1 }) {
|
|
106
|
+
const get = (value: any, path: string[]) => path.reduce((value, key) => value[key], value)
|
|
92
107
|
|
|
93
|
-
|
|
94
|
-
|
|
108
|
+
const compares = Object.keys($sort).map((key) => {
|
|
109
|
+
const direction = $sort[key]
|
|
110
|
+
const path = key.split('.')
|
|
95
111
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
compare = criterion.direction * exports.compare(getVal(a, criterion.keys), getVal(b, criterion.keys));
|
|
112
|
+
if (path.length === 1) {
|
|
113
|
+
return (a: any, b: any) => direction * compare(a[key], b[key])
|
|
99
114
|
} else {
|
|
100
|
-
|
|
115
|
+
return (a: any, b: any) => direction * compare(get(a, path), get(b, path))
|
|
101
116
|
}
|
|
117
|
+
})
|
|
102
118
|
|
|
103
|
-
|
|
104
|
-
|
|
119
|
+
return function (a: any, b: any) {
|
|
120
|
+
for (const compare of compares) {
|
|
121
|
+
const comparasion = compare(a, b)
|
|
122
|
+
|
|
123
|
+
if (comparasion !== 0) {
|
|
124
|
+
return comparasion
|
|
105
125
|
}
|
|
106
126
|
}
|
|
107
127
|
|
|
108
|
-
return 0
|
|
109
|
-
}
|
|
128
|
+
return 0
|
|
129
|
+
}
|
|
110
130
|
}
|
package/lib/filter-query.d.ts
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
export declare const FILTERS: {
|
|
2
|
-
$sort: (value: any) => any;
|
|
3
|
-
$limit: (value: any, options: any) => any;
|
|
4
|
-
$skip: (value: any) => number;
|
|
5
|
-
$select: (value: any) => any;
|
|
6
|
-
};
|
|
7
|
-
export declare const OPERATORS: string[];
|
|
8
|
-
export declare function filterQuery(query: any, options?: any): {
|
|
9
|
-
[key: string]: any;
|
|
10
|
-
};
|
package/lib/filter-query.js
DELETED
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.filterQuery = exports.OPERATORS = exports.FILTERS = void 0;
|
|
4
|
-
const commons_1 = require("@feathersjs/commons");
|
|
5
|
-
const errors_1 = require("@feathersjs/errors");
|
|
6
|
-
function parse(number) {
|
|
7
|
-
if (typeof number !== 'undefined') {
|
|
8
|
-
return Math.abs(parseInt(number, 10));
|
|
9
|
-
}
|
|
10
|
-
return undefined;
|
|
11
|
-
}
|
|
12
|
-
// Returns the pagination limit and will take into account the
|
|
13
|
-
// default and max pagination settings
|
|
14
|
-
function getLimit(limit, paginate) {
|
|
15
|
-
if (paginate && (paginate.default || paginate.max)) {
|
|
16
|
-
const base = paginate.default || 0;
|
|
17
|
-
const lower = typeof limit === 'number' && !isNaN(limit) ? limit : base;
|
|
18
|
-
const upper = typeof paginate.max === 'number' ? paginate.max : Number.MAX_VALUE;
|
|
19
|
-
return Math.min(lower, upper);
|
|
20
|
-
}
|
|
21
|
-
return limit;
|
|
22
|
-
}
|
|
23
|
-
// Makes sure that $sort order is always converted to an actual number
|
|
24
|
-
function convertSort(sort) {
|
|
25
|
-
if (typeof sort !== 'object' || Array.isArray(sort)) {
|
|
26
|
-
return sort;
|
|
27
|
-
}
|
|
28
|
-
return Object.keys(sort).reduce((result, key) => {
|
|
29
|
-
result[key] = typeof sort[key] === 'object'
|
|
30
|
-
? sort[key] : parseInt(sort[key], 10);
|
|
31
|
-
return result;
|
|
32
|
-
}, {});
|
|
33
|
-
}
|
|
34
|
-
function cleanQuery(query, operators, filters) {
|
|
35
|
-
if (Array.isArray(query)) {
|
|
36
|
-
return query.map(value => cleanQuery(value, operators, filters));
|
|
37
|
-
}
|
|
38
|
-
else if (commons_1._.isObject(query) && query.constructor === {}.constructor) {
|
|
39
|
-
const result = {};
|
|
40
|
-
commons_1._.each(query, (value, key) => {
|
|
41
|
-
if (key[0] === '$') {
|
|
42
|
-
if (filters[key] !== undefined) {
|
|
43
|
-
return;
|
|
44
|
-
}
|
|
45
|
-
if (!operators.includes(key)) {
|
|
46
|
-
throw new errors_1.BadRequest(`Invalid query parameter ${key}`, query);
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
result[key] = cleanQuery(value, operators, filters);
|
|
50
|
-
});
|
|
51
|
-
Object.getOwnPropertySymbols(query).forEach(symbol => {
|
|
52
|
-
// @ts-ignore
|
|
53
|
-
result[symbol] = query[symbol];
|
|
54
|
-
});
|
|
55
|
-
return result;
|
|
56
|
-
}
|
|
57
|
-
return query;
|
|
58
|
-
}
|
|
59
|
-
function assignFilters(object, query, filters, options) {
|
|
60
|
-
if (Array.isArray(filters)) {
|
|
61
|
-
commons_1._.each(filters, (key) => {
|
|
62
|
-
if (query[key] !== undefined) {
|
|
63
|
-
object[key] = query[key];
|
|
64
|
-
}
|
|
65
|
-
});
|
|
66
|
-
}
|
|
67
|
-
else {
|
|
68
|
-
commons_1._.each(filters, (converter, key) => {
|
|
69
|
-
const converted = converter(query[key], options);
|
|
70
|
-
if (converted !== undefined) {
|
|
71
|
-
object[key] = converted;
|
|
72
|
-
}
|
|
73
|
-
});
|
|
74
|
-
}
|
|
75
|
-
return object;
|
|
76
|
-
}
|
|
77
|
-
exports.FILTERS = {
|
|
78
|
-
$sort: (value) => convertSort(value),
|
|
79
|
-
$limit: (value, options) => getLimit(parse(value), options.paginate),
|
|
80
|
-
$skip: (value) => parse(value),
|
|
81
|
-
$select: (value) => value
|
|
82
|
-
};
|
|
83
|
-
exports.OPERATORS = ['$in', '$nin', '$lt', '$lte', '$gt', '$gte', '$ne', '$or'];
|
|
84
|
-
// Converts Feathers special query parameters and pagination settings
|
|
85
|
-
// and returns them separately a `filters` and the rest of the query
|
|
86
|
-
// as `query`
|
|
87
|
-
function filterQuery(query, options = {}) {
|
|
88
|
-
const { filters: additionalFilters = {}, operators: additionalOperators = [] } = options;
|
|
89
|
-
const result = {};
|
|
90
|
-
result.filters = assignFilters({}, query, exports.FILTERS, options);
|
|
91
|
-
result.filters = assignFilters(result.filters, query, additionalFilters, options);
|
|
92
|
-
result.query = cleanQuery(query, exports.OPERATORS.concat(additionalOperators), result.filters);
|
|
93
|
-
return result;
|
|
94
|
-
}
|
|
95
|
-
exports.filterQuery = filterQuery;
|
|
96
|
-
//# sourceMappingURL=filter-query.js.map
|
package/lib/filter-query.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"filter-query.js","sourceRoot":"","sources":["../src/filter-query.ts"],"names":[],"mappings":"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"}
|
package/src/filter-query.ts
DELETED
|
@@ -1,116 +0,0 @@
|
|
|
1
|
-
import { _ } from '@feathersjs/commons';
|
|
2
|
-
import { BadRequest } from '@feathersjs/errors';
|
|
3
|
-
|
|
4
|
-
function parse (number: any) {
|
|
5
|
-
if (typeof number !== 'undefined') {
|
|
6
|
-
return Math.abs(parseInt(number, 10));
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
return undefined;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
// Returns the pagination limit and will take into account the
|
|
13
|
-
// default and max pagination settings
|
|
14
|
-
function getLimit (limit: any, paginate: any) {
|
|
15
|
-
if (paginate && (paginate.default || paginate.max)) {
|
|
16
|
-
const base = paginate.default || 0;
|
|
17
|
-
const lower = typeof limit === 'number' && !isNaN(limit) ? limit : base;
|
|
18
|
-
const upper = typeof paginate.max === 'number' ? paginate.max : Number.MAX_VALUE;
|
|
19
|
-
|
|
20
|
-
return Math.min(lower, upper);
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
return limit;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
// Makes sure that $sort order is always converted to an actual number
|
|
27
|
-
function convertSort (sort: any) {
|
|
28
|
-
if (typeof sort !== 'object' || Array.isArray(sort)) {
|
|
29
|
-
return sort;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
return Object.keys(sort).reduce((result, key) => {
|
|
33
|
-
result[key] = typeof sort[key] === 'object'
|
|
34
|
-
? sort[key] : parseInt(sort[key], 10);
|
|
35
|
-
|
|
36
|
-
return result;
|
|
37
|
-
}, {} as { [key: string]: number });
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
function cleanQuery (query: any, operators: any, filters: any): any {
|
|
41
|
-
if (Array.isArray(query)) {
|
|
42
|
-
return query.map(value => cleanQuery(value, operators, filters));
|
|
43
|
-
} else if (_.isObject(query) && query.constructor === {}.constructor) {
|
|
44
|
-
const result: { [key: string]: any } = {};
|
|
45
|
-
|
|
46
|
-
_.each(query, (value, key) => {
|
|
47
|
-
if (key[0] === '$') {
|
|
48
|
-
if (filters[key] !== undefined) {
|
|
49
|
-
return;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
if (!operators.includes(key)) {
|
|
53
|
-
throw new BadRequest(`Invalid query parameter ${key}`, query);
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
result[key] = cleanQuery(value, operators, filters);
|
|
58
|
-
});
|
|
59
|
-
|
|
60
|
-
Object.getOwnPropertySymbols(query).forEach(symbol => {
|
|
61
|
-
// @ts-ignore
|
|
62
|
-
result[symbol] = query[symbol];
|
|
63
|
-
});
|
|
64
|
-
|
|
65
|
-
return result;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
return query;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
function assignFilters (object: any, query: any, filters: any, options: any) {
|
|
72
|
-
if (Array.isArray(filters)) {
|
|
73
|
-
_.each(filters, (key) => {
|
|
74
|
-
if (query[key] !== undefined) {
|
|
75
|
-
object[key] = query[key];
|
|
76
|
-
}
|
|
77
|
-
});
|
|
78
|
-
} else {
|
|
79
|
-
_.each(filters, (converter, key) => {
|
|
80
|
-
const converted = converter(query[key], options);
|
|
81
|
-
|
|
82
|
-
if (converted !== undefined) {
|
|
83
|
-
object[key] = converted;
|
|
84
|
-
}
|
|
85
|
-
});
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
return object;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
export const FILTERS = {
|
|
92
|
-
$sort: (value: any) => convertSort(value),
|
|
93
|
-
$limit: (value: any, options: any) => getLimit(parse(value), options.paginate),
|
|
94
|
-
$skip: (value: any) => parse(value),
|
|
95
|
-
$select: (value: any) => value
|
|
96
|
-
};
|
|
97
|
-
|
|
98
|
-
export const OPERATORS = ['$in', '$nin', '$lt', '$lte', '$gt', '$gte', '$ne', '$or'];
|
|
99
|
-
|
|
100
|
-
// Converts Feathers special query parameters and pagination settings
|
|
101
|
-
// and returns them separately a `filters` and the rest of the query
|
|
102
|
-
// as `query`
|
|
103
|
-
export function filterQuery (query: any, options: any = {}) {
|
|
104
|
-
const {
|
|
105
|
-
filters: additionalFilters = {},
|
|
106
|
-
operators: additionalOperators = []
|
|
107
|
-
} = options;
|
|
108
|
-
const result: { [key: string]: any } = {};
|
|
109
|
-
|
|
110
|
-
result.filters = assignFilters({}, query, FILTERS, options);
|
|
111
|
-
result.filters = assignFilters(result.filters, query, additionalFilters, options);
|
|
112
|
-
|
|
113
|
-
result.query = cleanQuery(query, OPERATORS.concat(additionalOperators), result.filters);
|
|
114
|
-
|
|
115
|
-
return result;
|
|
116
|
-
}
|