@feathersjs/adapter-commons 5.0.0-pre.6 → 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/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 (a: any, b: any) {
5
- if (a < b) { return -1; }
6
- if (a > b) { return 1; }
7
- return 0;
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 (a: any, b: any) {
11
- let i;
12
- let comp;
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 (comp !== 0) { return comp; }
18
+ if (comparison !== 0) {
19
+ return comparison
20
+ }
18
21
  }
19
22
 
20
23
  // Common section was identical, longest one wins
21
- return exports.compareNSB(a.length, b.length);
24
+ return compareNSB(a.length, b.length)
22
25
  }
23
26
 
24
- export function compare (a: any, b: any, compareStrings: any = exports.compareNSB) {
25
- const { compareNSB, compare, compareArrays } = exports;
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) { return b === undefined ? 0 : -1; }
29
- if (b === undefined) { return a === undefined ? 0 : 1; }
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) { return b === null ? 0 : -1; }
33
- if (b === null) { return a === null ? 0 : 1; }
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') { return typeof b === 'number' ? compareNSB(a, b) : -1; }
37
- if (typeof b === 'number') { return typeof a === 'number' ? compareNSB(a, b) : 1; }
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') { return typeof b === 'string' ? compareStrings(a, b) : -1; }
41
- if (typeof b === 'string') { return typeof a === 'string' ? compareStrings(a, b) : 1; }
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') { return typeof b === 'boolean' ? compareNSB(a, b) : -1; }
45
- if (typeof b === 'boolean') { return typeof a === 'boolean' ? compareNSB(a, b) : 1; }
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) { return b instanceof Date ? compareNSB(a.getTime(), b.getTime()) : -1; }
49
- if (b instanceof Date) { return a instanceof Date ? compareNSB(a.getTime(), b.getTime()) : 1; }
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)) { return Array.isArray(b) ? compareArrays(a, b) : -1; }
53
- if (Array.isArray(b)) { return Array.isArray(a) ? compareArrays(a, b) : 1; }
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; i < Math.min(aKeys.length, bKeys.length); i += 1) {
61
- comp = compare(a[aKeys[i]], b[bKeys[i]]);
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 (comp !== 0) { return comp; }
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 ($sort: any) {
72
- let sortLevels = false; // True if $sort has tags with '.' i.e. '{a: 1, b: -1, "c.x.z": 1}'
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
- return function (a: any, b: any) {
94
- let compare;
108
+ const compares = Object.keys($sort).map((key) => {
109
+ const direction = $sort[key]
110
+ const path = key.split('.')
95
111
 
96
- for (const criterion of criteria) {
97
- if (sortLevels) {
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
- compare = criterion.direction * exports.compare(a[criterion.keys[0]], b[criterion.keys[0]]);
115
+ return (a: any, b: any) => direction * compare(get(a, path), get(b, path))
101
116
  }
117
+ })
102
118
 
103
- if (compare !== 0) {
104
- return compare;
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
  }
@@ -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
- };
@@ -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
@@ -1 +0,0 @@
1
- {"version":3,"file":"filter-query.js","sourceRoot":"","sources":["../src/filter-query.ts"],"names":[],"mappings":"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"}
@@ -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
- }