feathers-utils 2.0.0-2 → 2.0.0-4
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/dist/esm/filters/array.d.ts +1 -1
- package/dist/esm/filters/array.js +2 -2
- package/dist/esm/filters/object.d.ts +2 -0
- package/dist/esm/filters/object.js +8 -0
- package/dist/esm/hooks/checkMulti.d.ts +2 -2
- package/dist/esm/hooks/createRelated.d.ts +8 -2
- package/dist/esm/hooks/createRelated.js +2 -3
- package/dist/esm/hooks/onDelete.d.ts +8 -2
- package/dist/esm/hooks/onDelete.js +8 -7
- package/dist/esm/hooks/removeRelated.d.ts +7 -2
- package/dist/esm/hooks/removeRelated.js +8 -7
- package/dist/esm/hooks/runPerItem.d.ts +5 -2
- package/dist/esm/hooks/runPerItem.js +1 -1
- package/dist/esm/hooks/setData.d.ts +7 -2
- package/dist/esm/hooks/setData.js +3 -2
- package/dist/esm/index.d.ts +19 -34
- package/dist/esm/index.js +21 -33
- package/dist/esm/mixins/debounce-mixin/DebouncedStore.d.ts +5 -2
- package/dist/esm/mixins/debounce-mixin/DebouncedStore.js +2 -2
- package/dist/esm/mixins/debounce-mixin/debounceMixin.d.ts +3 -0
- package/dist/esm/mixins/debounce-mixin/debounceMixin.js +19 -0
- package/dist/esm/mixins/debounce-mixin/index.d.ts +3 -8
- package/dist/esm/mixins/debounce-mixin/index.js +3 -20
- package/dist/esm/mixins/debounce-mixin/types.d.ts +13 -0
- package/dist/esm/mixins/debounce-mixin/types.js +1 -0
- package/dist/esm/types.d.ts +1 -77
- package/dist/esm/types.js +0 -1
- package/dist/esm/typesInternal.d.ts +3 -0
- package/dist/esm/typesInternal.js +3 -0
- package/dist/esm/utils/filterQuery.d.ts +6 -1
- package/dist/esm/utils/filterQuery.js +5 -3
- package/dist/esm/utils/getItemsIsArray.d.ts +5 -2
- package/dist/esm/utils/getItemsIsArray.js +7 -12
- package/dist/esm/utils/getPaginate.d.ts +2 -6
- package/dist/esm/utils/getPaginate.js +1 -1
- package/dist/esm/utils/isMulti.d.ts +1 -1
- package/dist/esm/utils/isPaginated.d.ts +1 -1
- package/dist/esm/utils/markHookForSkip.d.ts +3 -2
- package/dist/esm/utils/markHookForSkip.js +6 -5
- package/dist/esm/utils/mergeQuery/index.d.ts +3 -3
- package/dist/esm/utils/mergeQuery/index.js +3 -338
- package/dist/esm/utils/mergeQuery/mergeArrays.d.ts +2 -1
- package/dist/esm/utils/mergeQuery/mergeArrays.js +2 -2
- package/dist/esm/utils/mergeQuery/mergeQuery.d.ts +3 -0
- package/dist/esm/utils/mergeQuery/mergeQuery.js +68 -0
- package/dist/esm/utils/mergeQuery/types.d.ts +13 -0
- package/dist/esm/utils/mergeQuery/types.js +1 -0
- package/dist/esm/utils/mergeQuery/utils.d.ts +11 -0
- package/dist/esm/utils/mergeQuery/utils.js +272 -0
- package/dist/esm/utils/pushSet.d.ts +4 -1
- package/dist/esm/utils/pushSet.js +1 -1
- package/dist/esm/utils/setResultEmpty.d.ts +1 -1
- package/dist/esm/utils/setResultEmpty.js +1 -1
- package/dist/esm/utils/shouldSkip.d.ts +1 -1
- package/dist/esm/utils/validateQueryProperty.js +1 -1
- package/dist/filters/array.d.ts +1 -1
- package/dist/filters/array.js +2 -2
- package/dist/filters/object.d.ts +2 -0
- package/dist/filters/object.js +15 -0
- package/dist/hooks/checkMulti.d.ts +2 -2
- package/dist/hooks/createRelated.d.ts +8 -2
- package/dist/hooks/createRelated.js +2 -3
- package/dist/hooks/onDelete.d.ts +8 -2
- package/dist/hooks/onDelete.js +8 -7
- package/dist/hooks/removeRelated.d.ts +7 -2
- package/dist/hooks/removeRelated.js +8 -7
- package/dist/hooks/runPerItem.d.ts +5 -2
- package/dist/hooks/runPerItem.js +1 -1
- package/dist/hooks/setData.d.ts +7 -2
- package/dist/hooks/setData.js +3 -2
- package/dist/index.d.ts +19 -34
- package/dist/index.js +23 -49
- package/dist/mixins/debounce-mixin/DebouncedStore.d.ts +5 -2
- package/dist/mixins/debounce-mixin/DebouncedStore.js +2 -2
- package/dist/mixins/debounce-mixin/debounceMixin.d.ts +3 -0
- package/dist/mixins/debounce-mixin/debounceMixin.js +23 -0
- package/dist/mixins/debounce-mixin/index.d.ts +3 -8
- package/dist/mixins/debounce-mixin/index.js +17 -22
- package/dist/mixins/debounce-mixin/types.d.ts +13 -0
- package/dist/mixins/debounce-mixin/types.js +2 -0
- package/dist/types.d.ts +1 -77
- package/dist/types.js +0 -1
- package/dist/typesInternal.d.ts +3 -0
- package/dist/typesInternal.js +4 -0
- package/dist/utils/filterQuery.d.ts +6 -1
- package/dist/utils/filterQuery.js +4 -2
- package/dist/utils/getItemsIsArray.d.ts +5 -2
- package/dist/utils/getItemsIsArray.js +7 -12
- package/dist/utils/getPaginate.d.ts +2 -6
- package/dist/utils/isMulti.d.ts +1 -1
- package/dist/utils/isPaginated.d.ts +1 -1
- package/dist/utils/markHookForSkip.d.ts +3 -2
- package/dist/utils/markHookForSkip.js +6 -5
- package/dist/utils/mergeQuery/index.d.ts +3 -3
- package/dist/utils/mergeQuery/index.js +16 -342
- package/dist/utils/mergeQuery/mergeArrays.d.ts +2 -1
- package/dist/utils/mergeQuery/mergeArrays.js +2 -2
- package/dist/utils/mergeQuery/mergeQuery.d.ts +3 -0
- package/dist/utils/mergeQuery/mergeQuery.js +75 -0
- package/dist/utils/mergeQuery/types.d.ts +13 -0
- package/dist/utils/mergeQuery/types.js +2 -0
- package/dist/utils/mergeQuery/utils.d.ts +11 -0
- package/dist/utils/mergeQuery/utils.js +287 -0
- package/dist/utils/pushSet.d.ts +4 -1
- package/dist/utils/pushSet.js +1 -1
- package/dist/utils/setResultEmpty.d.ts +1 -1
- package/dist/utils/setResultEmpty.js +1 -1
- package/dist/utils/shouldSkip.d.ts +1 -1
- package/package.json +5 -2
- package/src/filters/array.ts +13 -9
- package/src/filters/object.ts +15 -0
- package/src/hooks/checkMulti.ts +8 -6
- package/src/hooks/createRelated.ts +21 -12
- package/src/hooks/onDelete.ts +28 -13
- package/src/hooks/removeRelated.ts +28 -16
- package/src/hooks/runPerItem.ts +19 -10
- package/src/hooks/setData.ts +24 -15
- package/src/index.ts +21 -38
- package/src/mixins/debounce-mixin/DebouncedStore.ts +29 -24
- package/src/mixins/debounce-mixin/debounceMixin.ts +33 -0
- package/src/mixins/debounce-mixin/index.ts +3 -39
- package/src/mixins/debounce-mixin/types.ts +16 -0
- package/src/types.ts +6 -117
- package/src/typesInternal.ts +6 -0
- package/src/utils/filterQuery.ts +22 -10
- package/src/utils/getItemsIsArray.ts +15 -16
- package/src/utils/getPaginate.ts +11 -14
- package/src/utils/isMulti.ts +3 -3
- package/src/utils/isPaginated.ts +6 -4
- package/src/utils/markHookForSkip.ts +18 -16
- package/src/utils/mergeQuery/index.ts +3 -379
- package/src/utils/mergeQuery/mergeArrays.ts +25 -18
- package/src/utils/mergeQuery/mergeQuery.ts +102 -0
- package/src/utils/mergeQuery/types.ts +25 -0
- package/src/utils/mergeQuery/utils.ts +342 -0
- package/src/utils/pushSet.ts +14 -7
- package/src/utils/setResultEmpty.ts +8 -6
- package/src/utils/shouldSkip.ts +4 -4
- package/src/utils/validateQueryProperty.ts +8 -4
|
@@ -1,345 +1,19 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var
|
|
3
|
-
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
4
15
|
};
|
|
5
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
const isEmpty_js_1 = __importDefault(require("lodash/isEmpty.js"));
|
|
10
|
-
const isEqual_js_1 = __importDefault(require("lodash/isEqual.js"));
|
|
11
|
-
const merge_js_1 = __importDefault(require("lodash/merge.js"));
|
|
12
|
-
const set_js_1 = __importDefault(require("lodash/set.js"));
|
|
13
|
-
const uniqWith_js_1 = __importDefault(require("lodash/uniqWith.js"));
|
|
14
|
-
const mergeArrays_1 = require("./mergeArrays");
|
|
15
|
-
const filterQuery_1 = require("../filterQuery");
|
|
16
|
-
const errors_1 = require("@feathersjs/errors");
|
|
17
|
-
const hasOwnProperty = (obj, key) => {
|
|
18
|
-
return Object.prototype.hasOwnProperty.call(obj, key);
|
|
19
|
-
};
|
|
20
|
-
function handleArray(target, source, key, options) {
|
|
21
|
-
const targetVal = (0, get_js_1.default)(target, key);
|
|
22
|
-
const sourceVal = (0, get_js_1.default)(source, key);
|
|
23
|
-
if (!sourceVal && !targetVal) {
|
|
24
|
-
return;
|
|
25
|
-
}
|
|
26
|
-
const handle = (0, get_js_1.default)(options, ["handle", ...key], options.defaultHandle);
|
|
27
|
-
const arr = (0, mergeArrays_1.mergeArrays)(targetVal, sourceVal, handle, key, options.actionOnEmptyIntersect);
|
|
28
|
-
(0, set_js_1.default)(target, key, arr);
|
|
29
|
-
}
|
|
30
|
-
function handleCircular(target, source, prependKey, options) {
|
|
31
|
-
if (target === null || target === void 0 ? void 0 : target.$or) {
|
|
32
|
-
target.$or = cleanOr(target.$or);
|
|
33
|
-
if (!target.$or) {
|
|
34
|
-
delete target.$or;
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
if (source === null || source === void 0 ? void 0 : source.$or) {
|
|
38
|
-
source.$or = cleanOr(source.$or);
|
|
39
|
-
if (!source.$or) {
|
|
40
|
-
delete source.$or;
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
if (target === null || target === void 0 ? void 0 : target.$and) {
|
|
44
|
-
target.$and = cleanAnd(target.$and);
|
|
45
|
-
if (!target.$and) {
|
|
46
|
-
delete target.$and;
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
if (source === null || source === void 0 ? void 0 : source.$and) {
|
|
50
|
-
source.$and = cleanAnd(source.$and);
|
|
51
|
-
if (!source.$and) {
|
|
52
|
-
delete source.$and;
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
if (!(0, has_js_1.default)(source, prependKey)) {
|
|
56
|
-
return;
|
|
57
|
-
}
|
|
58
|
-
if (!(0, has_js_1.default)(target, prependKey)) {
|
|
59
|
-
(0, set_js_1.default)(target, prependKey, (0, get_js_1.default)(source, prependKey));
|
|
60
|
-
return;
|
|
61
|
-
}
|
|
62
|
-
const { defaultHandle, actionOnEmptyIntersect } = options;
|
|
63
|
-
if (defaultHandle === "target") {
|
|
64
|
-
return;
|
|
65
|
-
}
|
|
66
|
-
const getTargetVal = () => {
|
|
67
|
-
return (prependKey.length > 0) ? (0, get_js_1.default)(target, prependKey) : target;
|
|
68
|
-
};
|
|
69
|
-
const getSourceVal = () => {
|
|
70
|
-
return (prependKey.length > 0) ? (0, get_js_1.default)(source, prependKey) : source;
|
|
71
|
-
};
|
|
72
|
-
const targetVal = getTargetVal();
|
|
73
|
-
const sourceVal = getSourceVal();
|
|
74
|
-
if ((0, isEqual_js_1.default)(targetVal, sourceVal)) {
|
|
75
|
-
return;
|
|
76
|
-
}
|
|
77
|
-
if (defaultHandle === "source") {
|
|
78
|
-
(0, set_js_1.default)(target, prependKey, sourceVal);
|
|
79
|
-
return;
|
|
80
|
-
}
|
|
81
|
-
if (targetVal === null || sourceVal === null) {
|
|
82
|
-
(0, set_js_1.default)(target, prependKey, sourceVal);
|
|
83
|
-
return;
|
|
84
|
-
}
|
|
85
|
-
const typeOfTargetVal = typeof targetVal;
|
|
86
|
-
if (["boolean"].includes(typeOfTargetVal)) {
|
|
87
|
-
if (defaultHandle === "intersect") {
|
|
88
|
-
actionOnEmptyIntersect(target, source, prependKey);
|
|
89
|
-
}
|
|
90
|
-
(0, set_js_1.default)(target, prependKey, sourceVal);
|
|
91
|
-
return;
|
|
92
|
-
}
|
|
93
|
-
const typeOfSourceVal = typeof sourceVal;
|
|
94
|
-
const isTargetSimple = ["string", "number"].includes(typeOfTargetVal);
|
|
95
|
-
const isSourceSimple = ["string", "number"].includes(typeOfSourceVal);
|
|
96
|
-
if (isTargetSimple || isSourceSimple) {
|
|
97
|
-
if (isTargetSimple && isSourceSimple) {
|
|
98
|
-
if (defaultHandle === "combine") {
|
|
99
|
-
(0, set_js_1.default)(target, prependKey, { $in: [...new Set([targetVal, sourceVal])] });
|
|
100
|
-
return;
|
|
101
|
-
}
|
|
102
|
-
else if (defaultHandle === "intersect") {
|
|
103
|
-
actionOnEmptyIntersect(target, source, prependKey);
|
|
104
|
-
}
|
|
105
|
-
else {
|
|
106
|
-
throw new Error("should not reach here");
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
else if (hasOwnProperty(targetVal, "$in") || hasOwnProperty(sourceVal, "$in")) {
|
|
110
|
-
const targetHasIn = hasOwnProperty(targetVal, "$in");
|
|
111
|
-
const $in = (targetHasIn) ? targetVal["$in"] : sourceVal["$in"];
|
|
112
|
-
const otherVal = (isTargetSimple) ? targetVal : sourceVal;
|
|
113
|
-
if ($in.length === 1 && (0, isEqual_js_1.default)($in[0], otherVal)) {
|
|
114
|
-
(0, set_js_1.default)(target, prependKey, otherVal);
|
|
115
|
-
return;
|
|
116
|
-
}
|
|
117
|
-
else if (defaultHandle === "combine") {
|
|
118
|
-
if (!$in.some((x) => (0, isEqual_js_1.default)(x, otherVal))) {
|
|
119
|
-
$in.push(otherVal);
|
|
120
|
-
}
|
|
121
|
-
(0, set_js_1.default)(target, `${prependKey}.$in`, $in);
|
|
122
|
-
return;
|
|
123
|
-
}
|
|
124
|
-
else if (defaultHandle === "intersect") {
|
|
125
|
-
if ($in.some((x) => (0, isEqual_js_1.default)(x, otherVal))) {
|
|
126
|
-
(0, set_js_1.default)(target, prependKey, otherVal);
|
|
127
|
-
}
|
|
128
|
-
else {
|
|
129
|
-
actionOnEmptyIntersect(target, source, prependKey);
|
|
130
|
-
}
|
|
131
|
-
return;
|
|
132
|
-
}
|
|
133
|
-
return;
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
const isTargetArray = Array.isArray(targetVal);
|
|
137
|
-
const isSourceArray = Array.isArray(sourceVal);
|
|
138
|
-
if (isTargetArray && isSourceArray) {
|
|
139
|
-
const key = prependKey[prependKey.length - 1];
|
|
140
|
-
if (key === "$or") {
|
|
141
|
-
if (defaultHandle === "combine") {
|
|
142
|
-
const newVals = sourceVal.filter((x) => !targetVal.some((y) => (0, isEqual_js_1.default)(x, y)));
|
|
143
|
-
targetVal.push(...newVals);
|
|
144
|
-
}
|
|
145
|
-
else if (defaultHandle === "intersect") {
|
|
146
|
-
// combine into "$and"
|
|
147
|
-
const targetParent = getParentProp(target, prependKey);
|
|
148
|
-
const sourceParent = getParentProp(source, prependKey);
|
|
149
|
-
targetParent.$and = targetParent.$and || [];
|
|
150
|
-
targetParent.$and.push({ $or: targetVal }, { $or: sourceVal });
|
|
151
|
-
targetParent.$and = cleanAnd(targetParent.$and);
|
|
152
|
-
if (!targetParent.$and) {
|
|
153
|
-
delete targetParent.$and;
|
|
154
|
-
}
|
|
155
|
-
delete targetParent.$or;
|
|
156
|
-
delete sourceParent.$or;
|
|
157
|
-
handleCircular(target, source, [...prependKey, "$and"], options);
|
|
158
|
-
return;
|
|
159
|
-
}
|
|
160
|
-
return;
|
|
161
|
-
}
|
|
162
|
-
else if (key === "$and") {
|
|
163
|
-
if (defaultHandle === "combine") {
|
|
164
|
-
// combine into "$or"
|
|
165
|
-
const targetParent = getParentProp(target, prependKey);
|
|
166
|
-
const sourceParent = getParentProp(source, prependKey);
|
|
167
|
-
targetParent.$or = targetParent.$or || [];
|
|
168
|
-
targetParent.$or.push({ $and: targetVal }, { $and: sourceVal });
|
|
169
|
-
targetParent.$or = cleanOr(targetParent.$or);
|
|
170
|
-
if (!targetParent.$or) {
|
|
171
|
-
delete targetParent.$or;
|
|
172
|
-
}
|
|
173
|
-
delete targetParent.$and;
|
|
174
|
-
delete sourceParent.$and;
|
|
175
|
-
handleCircular(target, source, [...prependKey, "$or"], options);
|
|
176
|
-
return;
|
|
177
|
-
}
|
|
178
|
-
else if (defaultHandle === "intersect") {
|
|
179
|
-
const newVals = sourceVal.filter((x) => !targetVal.some((y) => (0, isEqual_js_1.default)(x, y)));
|
|
180
|
-
targetVal.push(...newVals);
|
|
181
|
-
return;
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
else if (key === "$in") {
|
|
185
|
-
if (defaultHandle === "combine") {
|
|
186
|
-
let $in = targetVal.concat(sourceVal);
|
|
187
|
-
$in = [...new Set($in)];
|
|
188
|
-
(0, set_js_1.default)(target, prependKey, $in);
|
|
189
|
-
return;
|
|
190
|
-
}
|
|
191
|
-
else if (defaultHandle === "intersect") {
|
|
192
|
-
const $in = targetVal.filter((x) => sourceVal.some((y) => (0, isEqual_js_1.default)(x, y)));
|
|
193
|
-
if ($in.length === 0) {
|
|
194
|
-
actionOnEmptyIntersect(target, source, prependKey);
|
|
195
|
-
}
|
|
196
|
-
else if ($in.length === 1) {
|
|
197
|
-
(0, set_js_1.default)(target, prependKey.slice(0, -1), $in[0]);
|
|
198
|
-
return;
|
|
199
|
-
}
|
|
200
|
-
else {
|
|
201
|
-
(0, set_js_1.default)(target, prependKey, $in);
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
return;
|
|
205
|
-
}
|
|
206
|
-
(0, set_js_1.default)(target, prependKey, sourceVal);
|
|
207
|
-
return;
|
|
208
|
-
}
|
|
209
|
-
if (typeOfTargetVal !== "object" || typeOfSourceVal !== "object") {
|
|
210
|
-
(0, set_js_1.default)(target, prependKey, sourceVal);
|
|
211
|
-
return;
|
|
212
|
-
}
|
|
213
|
-
// both are objects
|
|
214
|
-
const sourceKeys = Object.keys(sourceVal);
|
|
215
|
-
for (let i = 0, n = sourceKeys.length; i < n; i++) {
|
|
216
|
-
const key = sourceKeys[i];
|
|
217
|
-
handleCircular(target, source, [...prependKey, key], options);
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
function makeDefaultOptions(options) {
|
|
221
|
-
options = options || {};
|
|
222
|
-
options.defaultHandle = options.defaultHandle || "combine";
|
|
223
|
-
options.useLogicalConjunction =
|
|
224
|
-
(Object.prototype.hasOwnProperty.call(options, "useLogicalConjunction"))
|
|
225
|
-
? options.useLogicalConjunction
|
|
226
|
-
: false;
|
|
227
|
-
options.actionOnEmptyIntersect = options.actionOnEmptyIntersect || (() => {
|
|
228
|
-
throw new errors_1.Forbidden("You're not allowed to make this request");
|
|
229
|
-
});
|
|
230
|
-
options.handle = options.handle || {};
|
|
231
|
-
if (options.defaultHandle === "intersect") {
|
|
232
|
-
options.handle.$select = options.handle.$select || "intersectOrFull";
|
|
233
|
-
}
|
|
234
|
-
return options;
|
|
235
|
-
}
|
|
236
|
-
function moveProperty(source, target, key) {
|
|
237
|
-
if (!Object.prototype.hasOwnProperty.call(source, key)) {
|
|
238
|
-
return;
|
|
239
|
-
}
|
|
240
|
-
target[key] = source[key];
|
|
241
|
-
delete source[key];
|
|
242
|
-
}
|
|
243
|
-
function mergeQuery(target, source, options) {
|
|
244
|
-
const fullOptions = makeDefaultOptions(options);
|
|
245
|
-
const { filters: targetFilters, query: targetQuery } = (0, filterQuery_1.filterQuery)(target, {
|
|
246
|
-
operators: fullOptions.operators,
|
|
247
|
-
service: fullOptions.service
|
|
248
|
-
});
|
|
249
|
-
moveProperty(targetFilters, targetQuery, "$or");
|
|
250
|
-
moveProperty(targetFilters, targetQuery, "$and");
|
|
251
|
-
if (target.$limit) {
|
|
252
|
-
targetFilters.$limit = target.$limit;
|
|
253
|
-
}
|
|
254
|
-
let {
|
|
255
|
-
// eslint-disable-next-line prefer-const
|
|
256
|
-
filters: sourceFilters, query: sourceQuery } = (0, filterQuery_1.filterQuery)(source, {
|
|
257
|
-
operators: fullOptions.operators,
|
|
258
|
-
service: fullOptions.service
|
|
259
|
-
});
|
|
260
|
-
moveProperty(sourceFilters, sourceQuery, "$or");
|
|
261
|
-
moveProperty(sourceFilters, sourceQuery, "$and");
|
|
262
|
-
if (source.$limit) {
|
|
263
|
-
sourceFilters.$limit = source.$limit;
|
|
264
|
-
}
|
|
265
|
-
//#region filters
|
|
266
|
-
if (target &&
|
|
267
|
-
!Object.prototype.hasOwnProperty.call(target, "$limit") &&
|
|
268
|
-
Object.prototype.hasOwnProperty.call(targetFilters, "$limit")) {
|
|
269
|
-
delete targetFilters.$limit;
|
|
270
|
-
}
|
|
271
|
-
if (source &&
|
|
272
|
-
!Object.prototype.hasOwnProperty.call(source, "$limit") &&
|
|
273
|
-
Object.prototype.hasOwnProperty.call(sourceFilters, "$limit")) {
|
|
274
|
-
delete sourceFilters.$limit;
|
|
275
|
-
}
|
|
276
|
-
handleArray(targetFilters, sourceFilters, ["$select"], fullOptions);
|
|
277
|
-
// remaining filters
|
|
278
|
-
delete sourceFilters["$select"];
|
|
279
|
-
(0, merge_js_1.default)(targetFilters, sourceFilters);
|
|
280
|
-
//#endregion
|
|
281
|
-
//#region '$or' / '$and'
|
|
282
|
-
if ((options === null || options === void 0 ? void 0 : options.useLogicalConjunction) &&
|
|
283
|
-
(options.defaultHandle === "combine" ||
|
|
284
|
-
options.defaultHandle === "intersect") &&
|
|
285
|
-
!(0, isEmpty_js_1.default)(targetQuery)) {
|
|
286
|
-
const logicalOp = (options.defaultHandle === "combine")
|
|
287
|
-
? "$or"
|
|
288
|
-
: "$and";
|
|
289
|
-
if (Object.prototype.hasOwnProperty.call(sourceQuery, logicalOp)) {
|
|
290
|
-
// omit '$or'/'$and' and put all other props into '$or'/'$and'
|
|
291
|
-
const andOr = sourceQuery[logicalOp];
|
|
292
|
-
delete sourceQuery[logicalOp];
|
|
293
|
-
andOr.push(sourceQuery);
|
|
294
|
-
sourceQuery = { [logicalOp]: andOr };
|
|
295
|
-
}
|
|
296
|
-
else {
|
|
297
|
-
sourceQuery = { [logicalOp]: [sourceQuery] };
|
|
298
|
-
}
|
|
299
|
-
}
|
|
300
|
-
//#endregion
|
|
301
|
-
const keys = Object.keys(sourceQuery);
|
|
302
|
-
for (let i = 0, n = keys.length; i < n; i++) {
|
|
303
|
-
const key = keys[i];
|
|
304
|
-
handleCircular(targetQuery, sourceQuery, [key], fullOptions);
|
|
305
|
-
}
|
|
306
|
-
const result = Object.assign({}, targetFilters, targetQuery);
|
|
307
|
-
return result;
|
|
308
|
-
}
|
|
309
|
-
exports.mergeQuery = mergeQuery;
|
|
310
|
-
function getParentProp(target, path) {
|
|
311
|
-
if (path.length <= 1) {
|
|
312
|
-
return target;
|
|
313
|
-
}
|
|
314
|
-
const pathOneUp = path.slice(0, -1);
|
|
315
|
-
return (0, get_js_1.default)(target, pathOneUp);
|
|
316
|
-
}
|
|
317
|
-
function cleanOr(target) {
|
|
318
|
-
if (!target || !Array.isArray(target) || target.length <= 0) {
|
|
319
|
-
return target;
|
|
320
|
-
}
|
|
321
|
-
if (target.some(x => (0, isEmpty_js_1.default)(x))) {
|
|
322
|
-
return undefined;
|
|
323
|
-
}
|
|
324
|
-
else {
|
|
325
|
-
return arrayWithoutDuplicates(target);
|
|
326
|
-
}
|
|
327
|
-
}
|
|
328
|
-
function cleanAnd(target) {
|
|
329
|
-
if (!target || !Array.isArray(target) || target.length <= 0) {
|
|
330
|
-
return target;
|
|
331
|
-
}
|
|
332
|
-
if (target.every(x => (0, isEmpty_js_1.default)(x))) {
|
|
333
|
-
return undefined;
|
|
334
|
-
}
|
|
335
|
-
else {
|
|
336
|
-
target = target.filter(x => !(0, isEmpty_js_1.default)(x));
|
|
337
|
-
return arrayWithoutDuplicates(target);
|
|
338
|
-
}
|
|
339
|
-
}
|
|
340
|
-
function arrayWithoutDuplicates(target) {
|
|
341
|
-
if (!target || !Array.isArray(target)) {
|
|
342
|
-
return target;
|
|
343
|
-
}
|
|
344
|
-
return (0, uniqWith_js_1.default)(target, isEqual_js_1.default);
|
|
345
|
-
}
|
|
17
|
+
__exportStar(require("./mergeArrays"), exports);
|
|
18
|
+
__exportStar(require("./mergeQuery"), exports);
|
|
19
|
+
__exportStar(require("./types"), exports);
|
|
@@ -1,2 +1,3 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { Path } from "../../typesInternal";
|
|
2
|
+
import type { Handle, ActionOnEmptyIntersect } from "./types";
|
|
2
3
|
export declare function mergeArrays<T>(targetArr: T[], sourceArr: T[], handle: Handle, prependKey?: Path, actionOnEmptyIntersect?: ActionOnEmptyIntersect): T[] | undefined;
|
|
@@ -31,10 +31,10 @@ function mergeArrays(targetArr, sourceArr, handle, prependKey, actionOnEmptyInte
|
|
|
31
31
|
return;
|
|
32
32
|
}
|
|
33
33
|
if (handle === "intersectOrFull") {
|
|
34
|
-
const val =
|
|
34
|
+
const val = !targetIsArray ? targetArr : sourceArr;
|
|
35
35
|
return val;
|
|
36
36
|
}
|
|
37
|
-
return targetArr.filter(val => sourceArr.includes(val));
|
|
37
|
+
return targetArr.filter((val) => sourceArr.includes(val));
|
|
38
38
|
}
|
|
39
39
|
return undefined;
|
|
40
40
|
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.mergeQuery = void 0;
|
|
7
|
+
const merge_js_1 = __importDefault(require("lodash/merge.js"));
|
|
8
|
+
const isEmpty_js_1 = __importDefault(require("lodash/isEmpty.js"));
|
|
9
|
+
const utils_1 = require("./utils");
|
|
10
|
+
const filterQuery_1 = require("../filterQuery");
|
|
11
|
+
function mergeQuery(target, source, options) {
|
|
12
|
+
const fullOptions = (0, utils_1.makeDefaultOptions)(options);
|
|
13
|
+
const { filters: targetFilters, query: targetQuery } = (0, filterQuery_1.filterQuery)(target, {
|
|
14
|
+
operators: fullOptions.operators,
|
|
15
|
+
service: fullOptions.service,
|
|
16
|
+
});
|
|
17
|
+
(0, utils_1.moveProperty)(targetFilters, targetQuery, "$or");
|
|
18
|
+
(0, utils_1.moveProperty)(targetFilters, targetQuery, "$and");
|
|
19
|
+
if (target.$limit) {
|
|
20
|
+
targetFilters.$limit = target.$limit;
|
|
21
|
+
}
|
|
22
|
+
let {
|
|
23
|
+
// eslint-disable-next-line prefer-const
|
|
24
|
+
filters: sourceFilters, query: sourceQuery, } = (0, filterQuery_1.filterQuery)(source, {
|
|
25
|
+
operators: fullOptions.operators,
|
|
26
|
+
service: fullOptions.service,
|
|
27
|
+
});
|
|
28
|
+
(0, utils_1.moveProperty)(sourceFilters, sourceQuery, "$or");
|
|
29
|
+
(0, utils_1.moveProperty)(sourceFilters, sourceQuery, "$and");
|
|
30
|
+
if (source.$limit) {
|
|
31
|
+
sourceFilters.$limit = source.$limit;
|
|
32
|
+
}
|
|
33
|
+
//#region filters
|
|
34
|
+
if (target &&
|
|
35
|
+
!Object.prototype.hasOwnProperty.call(target, "$limit") &&
|
|
36
|
+
Object.prototype.hasOwnProperty.call(targetFilters, "$limit")) {
|
|
37
|
+
delete targetFilters.$limit;
|
|
38
|
+
}
|
|
39
|
+
if (source &&
|
|
40
|
+
!Object.prototype.hasOwnProperty.call(source, "$limit") &&
|
|
41
|
+
Object.prototype.hasOwnProperty.call(sourceFilters, "$limit")) {
|
|
42
|
+
delete sourceFilters.$limit;
|
|
43
|
+
}
|
|
44
|
+
(0, utils_1.handleArray)(targetFilters, sourceFilters, ["$select"], fullOptions);
|
|
45
|
+
// remaining filters
|
|
46
|
+
delete sourceFilters["$select"];
|
|
47
|
+
(0, merge_js_1.default)(targetFilters, sourceFilters);
|
|
48
|
+
//#endregion
|
|
49
|
+
//#region '$or' / '$and'
|
|
50
|
+
if ((options === null || options === void 0 ? void 0 : options.useLogicalConjunction) &&
|
|
51
|
+
(options.defaultHandle === "combine" ||
|
|
52
|
+
options.defaultHandle === "intersect") &&
|
|
53
|
+
!(0, isEmpty_js_1.default)(targetQuery)) {
|
|
54
|
+
const logicalOp = options.defaultHandle === "combine" ? "$or" : "$and";
|
|
55
|
+
if (Object.prototype.hasOwnProperty.call(sourceQuery, logicalOp)) {
|
|
56
|
+
// omit '$or'/'$and' and put all other props into '$or'/'$and'
|
|
57
|
+
const andOr = sourceQuery[logicalOp];
|
|
58
|
+
delete sourceQuery[logicalOp];
|
|
59
|
+
andOr.push(sourceQuery);
|
|
60
|
+
sourceQuery = { [logicalOp]: andOr };
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
sourceQuery = { [logicalOp]: [sourceQuery] };
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
//#endregion
|
|
67
|
+
const keys = Object.keys(sourceQuery);
|
|
68
|
+
for (let i = 0, n = keys.length; i < n; i++) {
|
|
69
|
+
const key = keys[i];
|
|
70
|
+
(0, utils_1.handleCircular)(targetQuery, sourceQuery, [key], fullOptions);
|
|
71
|
+
}
|
|
72
|
+
const result = Object.assign({}, targetFilters, targetQuery);
|
|
73
|
+
return result;
|
|
74
|
+
}
|
|
75
|
+
exports.mergeQuery = mergeQuery;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Path } from "../../typesInternal";
|
|
2
|
+
import type { FilterQueryOptions } from "../filterQuery";
|
|
3
|
+
export declare type Handle = "target" | "source" | "combine" | "intersect" | "intersectOrFull";
|
|
4
|
+
export declare type FirstLast = "first" | "last";
|
|
5
|
+
export declare type ActionOnEmptyIntersect = (target: unknown, source: unknown, prependKey: Path) => void;
|
|
6
|
+
export interface MergeQueryOptions<T> extends FilterQueryOptions<T> {
|
|
7
|
+
defaultHandle: Handle;
|
|
8
|
+
actionOnEmptyIntersect: ActionOnEmptyIntersect;
|
|
9
|
+
useLogicalConjunction: boolean;
|
|
10
|
+
handle?: {
|
|
11
|
+
[key: string]: Handle;
|
|
12
|
+
};
|
|
13
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Path } from "../../typesInternal";
|
|
2
|
+
import type { MergeQueryOptions } from "./types";
|
|
3
|
+
export declare const hasOwnProperty: (obj: Record<string, unknown>, key: string) => boolean;
|
|
4
|
+
export declare function handleArray<T>(target: Record<string, unknown>, source: Record<string, unknown>, key: Path, options: MergeQueryOptions<T>): void;
|
|
5
|
+
export declare function handleCircular<T>(target: Record<string, unknown>, source: Record<string, unknown>, prependKey: Path, options: MergeQueryOptions<T>): void;
|
|
6
|
+
export declare function makeDefaultOptions<T>(options?: Partial<MergeQueryOptions<T>>): MergeQueryOptions<T>;
|
|
7
|
+
export declare function moveProperty(source: Record<string, any>, target: Record<string, any>, key: string): void;
|
|
8
|
+
export declare function getParentProp(target: Record<string, unknown>, path: Path): any;
|
|
9
|
+
export declare function cleanOr(target: Record<string, unknown>[]): Record<string, unknown>[] | undefined;
|
|
10
|
+
export declare function cleanAnd(target: Record<string, unknown>[]): Record<string, unknown>[] | undefined;
|
|
11
|
+
export declare function arrayWithoutDuplicates<T>(target: T[]): T[];
|