@webiny/api-headless-cms-ddb-es 0.0.0-mt-3 → 0.0.0-unstable.40876133bb
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/configurations.d.ts +2 -2
- package/configurations.js +18 -7
- package/configurations.js.map +1 -0
- package/definitions/entry.d.ts +2 -2
- package/definitions/entry.js +6 -7
- package/definitions/entry.js.map +1 -0
- package/definitions/entryElasticsearch.d.ts +2 -2
- package/definitions/entryElasticsearch.js +3 -7
- package/definitions/entryElasticsearch.js.map +1 -0
- package/definitions/group.d.ts +2 -2
- package/definitions/group.js +3 -7
- package/definitions/group.js.map +1 -0
- package/definitions/model.d.ts +2 -2
- package/definitions/model.js +3 -7
- package/definitions/model.js.map +1 -0
- package/definitions/settings.d.ts +2 -2
- package/definitions/settings.js +3 -7
- package/definitions/settings.js.map +1 -0
- package/definitions/system.d.ts +2 -2
- package/definitions/system.js +3 -7
- package/definitions/system.js.map +1 -0
- package/definitions/table.d.ts +2 -2
- package/definitions/table.js.map +1 -0
- package/definitions/tableElasticsearch.d.ts +2 -2
- package/definitions/tableElasticsearch.js.map +1 -0
- package/dynamoDb/index.d.ts +1 -1
- package/dynamoDb/index.js +4 -6
- package/dynamoDb/index.js.map +1 -0
- package/dynamoDb/storage/date.d.ts +2 -3
- package/dynamoDb/storage/date.js +80 -46
- package/dynamoDb/storage/date.js.map +1 -0
- package/dynamoDb/storage/longText.d.ts +7 -4
- package/dynamoDb/storage/longText.js +72 -54
- package/dynamoDb/storage/longText.js.map +1 -0
- package/dynamoDb/storage/richText.d.ts +2 -3
- package/dynamoDb/storage/richText.js +85 -67
- package/dynamoDb/storage/richText.js.map +1 -0
- package/elasticsearch/createElasticsearchIndex.d.ts +9 -0
- package/elasticsearch/createElasticsearchIndex.js +60 -0
- package/elasticsearch/createElasticsearchIndex.js.map +1 -0
- package/elasticsearch/deleteElasticsearchIndex.d.ts +8 -0
- package/elasticsearch/deleteElasticsearchIndex.js +43 -0
- package/elasticsearch/deleteElasticsearchIndex.js.map +1 -0
- package/elasticsearch/index.d.ts +1 -1
- package/elasticsearch/index.js +1 -1
- package/elasticsearch/index.js.map +1 -0
- package/elasticsearch/indexing/dateTimeIndexing.js +15 -1
- package/elasticsearch/indexing/dateTimeIndexing.js.map +1 -0
- package/elasticsearch/indexing/defaultFieldIndexing.js.map +1 -0
- package/elasticsearch/indexing/index.js +1 -1
- package/elasticsearch/indexing/index.js.map +1 -0
- package/elasticsearch/indexing/longTextIndexing.js.map +1 -0
- package/elasticsearch/indexing/numberIndexing.js.map +1 -0
- package/elasticsearch/indexing/objectIndexing.d.ts +9 -0
- package/elasticsearch/indexing/objectIndexing.js +32 -9
- package/elasticsearch/indexing/objectIndexing.js.map +1 -0
- package/elasticsearch/indexing/richTextIndexing.js.map +1 -0
- package/elasticsearch/indices/base.d.ts +2 -0
- package/elasticsearch/indices/base.js +15 -0
- package/elasticsearch/indices/base.js.map +1 -0
- package/elasticsearch/indices/index.d.ts +1 -0
- package/elasticsearch/indices/index.js +16 -0
- package/elasticsearch/indices/index.js.map +1 -0
- package/elasticsearch/indices/japanese.d.ts +2 -0
- package/elasticsearch/indices/japanese.js +16 -0
- package/elasticsearch/indices/japanese.js.map +1 -0
- package/elasticsearch/search/index.d.ts +2 -2
- package/elasticsearch/search/index.js +3 -5
- package/elasticsearch/search/index.js.map +1 -0
- package/elasticsearch/search/refSearch.d.ts +2 -3
- package/elasticsearch/search/refSearch.js +25 -16
- package/elasticsearch/search/refSearch.js.map +1 -0
- package/elasticsearch/search/timeSearch.d.ts +2 -3
- package/elasticsearch/search/timeSearch.js +22 -14
- package/elasticsearch/search/timeSearch.js.map +1 -0
- package/helpers/createElasticsearchQueryBody.js +320 -84
- package/helpers/createElasticsearchQueryBody.js.map +1 -0
- package/helpers/entryIndexHelpers.js +33 -18
- package/helpers/entryIndexHelpers.js.map +1 -0
- package/helpers/fields.d.ts +4 -62
- package/helpers/fields.js +39 -8
- package/helpers/fields.js.map +1 -0
- package/helpers/index.js.map +1 -0
- package/helpers/searchPluginsList.d.ts +2 -2
- package/helpers/searchPluginsList.js +1 -1
- package/helpers/searchPluginsList.js.map +1 -0
- package/helpers/transformValueForSearch.d.ts +5 -2
- package/helpers/transformValueForSearch.js +3 -0
- package/helpers/transformValueForSearch.js.map +1 -0
- package/index.d.ts +1 -0
- package/index.js +126 -29
- package/index.js.map +1 -0
- package/operations/entry/dataLoaders.d.ts +6 -2
- package/operations/entry/dataLoaders.js +31 -13
- package/operations/entry/dataLoaders.js.map +1 -0
- package/operations/entry/elasticsearchFields.js +6 -0
- package/operations/entry/elasticsearchFields.js.map +1 -0
- package/operations/entry/index.d.ts +2 -2
- package/operations/entry/index.js +445 -331
- package/operations/entry/index.js.map +1 -0
- package/operations/entry/keys.js.map +1 -0
- package/operations/group/index.d.ts +2 -2
- package/operations/group/index.js +8 -15
- package/operations/group/index.js.map +1 -0
- package/operations/model/index.d.ts +2 -2
- package/operations/model/index.js +38 -39
- package/operations/model/index.js.map +1 -0
- package/operations/settings/index.d.ts +2 -2
- package/operations/settings/index.js +7 -13
- package/operations/settings/index.js.map +1 -0
- package/operations/system/index.d.ts +2 -2
- package/operations/system/index.js +5 -11
- package/operations/system/index.js.map +1 -0
- package/package.json +24 -29
- package/plugins/CmsEntryElasticsearchBodyModifierPlugin.d.ts +6 -3
- package/plugins/CmsEntryElasticsearchBodyModifierPlugin.js +3 -3
- package/plugins/CmsEntryElasticsearchBodyModifierPlugin.js.map +1 -0
- package/plugins/CmsEntryElasticsearchFieldPlugin.d.ts +3 -3
- package/plugins/CmsEntryElasticsearchFieldPlugin.js +3 -3
- package/plugins/CmsEntryElasticsearchFieldPlugin.js.map +1 -0
- package/plugins/CmsEntryElasticsearchIndexPlugin.d.ts +4 -0
- package/plugins/CmsEntryElasticsearchIndexPlugin.js +17 -0
- package/plugins/CmsEntryElasticsearchIndexPlugin.js.map +1 -0
- package/plugins/CmsEntryElasticsearchQueryBuilderValueSearchPlugin.d.ts +30 -0
- package/plugins/CmsEntryElasticsearchQueryBuilderValueSearchPlugin.js +43 -0
- package/plugins/CmsEntryElasticsearchQueryBuilderValueSearchPlugin.js.map +1 -0
- package/plugins/CmsEntryElasticsearchQueryModifierPlugin.d.ts +3 -3
- package/plugins/CmsEntryElasticsearchQueryModifierPlugin.js +3 -3
- package/plugins/CmsEntryElasticsearchQueryModifierPlugin.js.map +1 -0
- package/plugins/CmsEntryElasticsearchSortModifierPlugin.d.ts +3 -3
- package/plugins/CmsEntryElasticsearchSortModifierPlugin.js +3 -3
- package/plugins/CmsEntryElasticsearchSortModifierPlugin.js.map +1 -0
- package/plugins/index.d.ts +6 -0
- package/plugins/index.js +83 -0
- package/plugins/index.js.map +1 -0
- package/types.d.ts +7 -34
- package/types.js +0 -13
- package/types.js.map +1 -0
- package/helpers/operatorPluginsList.d.ts +0 -7
- package/helpers/operatorPluginsList.js +0 -30
- package/operations/entry/fields.d.ts +0 -3
- package/operations/entry/fields.js +0 -60
- package/operations/system/createElasticsearchTemplate.d.ts +0 -5
- package/operations/system/createElasticsearchTemplate.js +0 -62
- package/upgrades/index.d.ts +0 -2
- package/upgrades/index.js +0 -16
- package/upgrades/utils.d.ts +0 -1
- package/upgrades/utils.js +0 -16
- package/upgrades/v5.0.0/cleanDatabaseRecord.d.ts +0 -6
- package/upgrades/v5.0.0/cleanDatabaseRecord.js +0 -16
- package/upgrades/v5.0.0/createOldVersionIndiceName.d.ts +0 -2
- package/upgrades/v5.0.0/createOldVersionIndiceName.js +0 -12
- package/upgrades/v5.0.0/entryValueFixer.d.ts +0 -4
- package/upgrades/v5.0.0/entryValueFixer.js +0 -124
- package/upgrades/v5.0.0/fieldFinder.d.ts +0 -6
- package/upgrades/v5.0.0/fieldFinder.js +0 -42
- package/upgrades/v5.0.0/helpers.d.ts +0 -4
- package/upgrades/v5.0.0/helpers.js +0 -57
- package/upgrades/v5.0.0/index.d.ts +0 -4
- package/upgrades/v5.0.0/index.js +0 -232
- package/upgrades/v5.8.0/index.d.ts +0 -4
- package/upgrades/v5.8.0/index.js +0 -426
|
@@ -1,32 +1,26 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
|
|
4
4
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", {
|
|
6
6
|
value: true
|
|
7
7
|
});
|
|
8
8
|
exports.createElasticsearchQueryBody = void 0;
|
|
9
9
|
|
|
10
|
-
var
|
|
10
|
+
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
|
|
11
11
|
|
|
12
12
|
var _error = _interopRequireDefault(require("@webiny/error"));
|
|
13
13
|
|
|
14
|
-
var _operatorPluginsList = require("./operatorPluginsList");
|
|
15
|
-
|
|
16
14
|
var _transformValueForSearch = require("./transformValueForSearch");
|
|
17
15
|
|
|
18
16
|
var _searchPluginsList = require("./searchPluginsList");
|
|
19
17
|
|
|
20
|
-
var
|
|
21
|
-
|
|
22
|
-
var _sort = require("@webiny/api-elasticsearch/sort");
|
|
18
|
+
var _apiElasticsearch = require("@webiny/api-elasticsearch");
|
|
23
19
|
|
|
24
20
|
var _fields = require("./fields");
|
|
25
21
|
|
|
26
22
|
var _CmsEntryElasticsearchFieldPlugin = require("../plugins/CmsEntryElasticsearchFieldPlugin");
|
|
27
23
|
|
|
28
|
-
var _where = require("@webiny/api-elasticsearch/where");
|
|
29
|
-
|
|
30
24
|
var _entry = require("../operations/entry");
|
|
31
25
|
|
|
32
26
|
var _CmsEntryElasticsearchQueryModifierPlugin = require("../plugins/CmsEntryElasticsearchQueryModifierPlugin");
|
|
@@ -35,12 +29,8 @@ var _CmsEntryElasticsearchSortModifierPlugin = require("../plugins/CmsEntryElast
|
|
|
35
29
|
|
|
36
30
|
var _CmsEntryElasticsearchBodyModifierPlugin = require("../plugins/CmsEntryElasticsearchBodyModifierPlugin");
|
|
37
31
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
|
|
41
|
-
|
|
42
|
-
const specialFields = ["published", "latest", "locale", "tenant"];
|
|
43
|
-
const noKeywordFields = ["date", "number", "boolean"];
|
|
32
|
+
const specialFields = ["published", "latest"];
|
|
33
|
+
const noKeywordFields = ["date", "datetime", "number", "boolean"];
|
|
44
34
|
|
|
45
35
|
const createElasticsearchSortParams = args => {
|
|
46
36
|
const {
|
|
@@ -51,28 +41,60 @@ const createElasticsearchSortParams = args => {
|
|
|
51
41
|
} = args;
|
|
52
42
|
|
|
53
43
|
if (!sort || sort.length === 0) {
|
|
54
|
-
return
|
|
44
|
+
return [];
|
|
55
45
|
}
|
|
56
46
|
|
|
47
|
+
const fieldIdToStorageIdIdMap = {};
|
|
57
48
|
const sortPlugins = Object.values(modelFields).reduce((plugins, modelField) => {
|
|
58
49
|
const searchPlugin = searchPlugins[modelField.type];
|
|
59
|
-
|
|
50
|
+
const {
|
|
51
|
+
fieldId,
|
|
52
|
+
storageId
|
|
53
|
+
} = modelField.field;
|
|
54
|
+
fieldIdToStorageIdIdMap[fieldId] = fieldId;
|
|
55
|
+
/**
|
|
56
|
+
* Plugins must be stored with fieldId as key because it is later used to find the sorting plugin.
|
|
57
|
+
*/
|
|
58
|
+
|
|
59
|
+
plugins[fieldId] = new _CmsEntryElasticsearchFieldPlugin.CmsEntryElasticsearchFieldPlugin({
|
|
60
60
|
unmappedType: modelField.unmappedType,
|
|
61
61
|
keyword: hasKeyword(modelField),
|
|
62
62
|
sortable: modelField.isSortable,
|
|
63
63
|
searchable: modelField.isSearchable,
|
|
64
|
-
field:
|
|
64
|
+
field: fieldId,
|
|
65
65
|
path: createFieldPath({
|
|
66
|
+
key: storageId,
|
|
66
67
|
parentPath,
|
|
67
|
-
modelField
|
|
68
|
+
modelField,
|
|
68
69
|
searchPlugin
|
|
69
70
|
})
|
|
70
71
|
});
|
|
71
72
|
return plugins;
|
|
72
73
|
}, {});
|
|
73
|
-
|
|
74
|
+
const transformedSort = sort.map(value => {
|
|
75
|
+
const matched = value.match(/^([a-zA-Z-0-9_]+)_(ASC|DESC)$/);
|
|
76
|
+
|
|
77
|
+
if (!matched) {
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
const [, fieldId, order] = matched;
|
|
82
|
+
|
|
83
|
+
if (fieldIdToStorageIdIdMap[fieldId]) {
|
|
84
|
+
return `${fieldIdToStorageIdIdMap[fieldId]}_${order}`;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
return value;
|
|
88
|
+
}).filter(Boolean);
|
|
89
|
+
return (0, _apiElasticsearch.createSort)({
|
|
74
90
|
fieldPlugins: sortPlugins,
|
|
75
|
-
sort
|
|
91
|
+
sort: transformedSort
|
|
92
|
+
});
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
const findFieldByFieldId = (model, fieldId) => {
|
|
96
|
+
return model.fields.find(field => {
|
|
97
|
+
return field.fieldId === fieldId;
|
|
76
98
|
});
|
|
77
99
|
};
|
|
78
100
|
/**
|
|
@@ -82,10 +104,16 @@ const createElasticsearchSortParams = args => {
|
|
|
82
104
|
*/
|
|
83
105
|
|
|
84
106
|
|
|
85
|
-
const createInitialQueryValue =
|
|
107
|
+
const createInitialQueryValue = params => {
|
|
86
108
|
const {
|
|
87
|
-
|
|
88
|
-
|
|
109
|
+
model,
|
|
110
|
+
where: initialWhere
|
|
111
|
+
} = params;
|
|
112
|
+
/**
|
|
113
|
+
* Cast as partial so we can remove unnecessary keys.
|
|
114
|
+
*/
|
|
115
|
+
|
|
116
|
+
const where = (0, _objectSpread2.default)({}, initialWhere);
|
|
89
117
|
const query = {
|
|
90
118
|
must: [],
|
|
91
119
|
must_not: [],
|
|
@@ -98,22 +126,16 @@ const createInitialQueryValue = args => {
|
|
|
98
126
|
if (sharedIndex) {
|
|
99
127
|
query.must.push({
|
|
100
128
|
term: {
|
|
101
|
-
"tenant.keyword":
|
|
129
|
+
"tenant.keyword": model.tenant
|
|
102
130
|
}
|
|
103
131
|
});
|
|
104
132
|
}
|
|
105
133
|
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
"locale.keyword": where.locale
|
|
112
|
-
}
|
|
113
|
-
});
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
delete where["locale"];
|
|
134
|
+
query.must.push({
|
|
135
|
+
term: {
|
|
136
|
+
"locale.keyword": model.locale
|
|
137
|
+
}
|
|
138
|
+
});
|
|
117
139
|
/**
|
|
118
140
|
* We must transform published and latest where args into something that is understandable by our Elasticsearch
|
|
119
141
|
*/
|
|
@@ -131,12 +153,8 @@ const createInitialQueryValue = args => {
|
|
|
131
153
|
}
|
|
132
154
|
});
|
|
133
155
|
} // we do not allow not published and not latest
|
|
134
|
-
else
|
|
135
|
-
throw new _error.default(`Cannot call Elasticsearch query
|
|
136
|
-
where
|
|
137
|
-
});
|
|
138
|
-
} else if (where.latest === false) {
|
|
139
|
-
throw new _error.default(`Cannot call Elasticsearch query with "latest" set at false.`, "ELASTICSEARCH_UNSUPPORTED_QUERY", {
|
|
156
|
+
else {
|
|
157
|
+
throw new _error.default(`Cannot call Elasticsearch query when not setting "published" or "latest".`, "ELASTICSEARCH_UNSUPPORTED_QUERY", {
|
|
140
158
|
where
|
|
141
159
|
});
|
|
142
160
|
} //
|
|
@@ -148,20 +166,26 @@ const createInitialQueryValue = args => {
|
|
|
148
166
|
const createFieldPath = ({
|
|
149
167
|
modelField,
|
|
150
168
|
searchPlugin,
|
|
151
|
-
parentPath
|
|
169
|
+
parentPath,
|
|
170
|
+
key
|
|
152
171
|
}) => {
|
|
153
|
-
let path;
|
|
172
|
+
let path = null;
|
|
154
173
|
|
|
155
174
|
if (searchPlugin && typeof searchPlugin.createPath === "function") {
|
|
156
175
|
path = searchPlugin.createPath({
|
|
157
|
-
field: modelField.field
|
|
176
|
+
field: modelField.field,
|
|
177
|
+
value: null,
|
|
178
|
+
key
|
|
158
179
|
});
|
|
159
180
|
} else if (typeof modelField.path === "function") {
|
|
160
|
-
path = modelField.path(modelField.field.
|
|
181
|
+
path = modelField.path(modelField.field.storageId);
|
|
161
182
|
}
|
|
162
183
|
|
|
163
184
|
if (!path) {
|
|
164
|
-
|
|
185
|
+
/**
|
|
186
|
+
* We know that modelFieldPath is a string or undefined at this point.
|
|
187
|
+
*/
|
|
188
|
+
path = modelField.path || modelField.field.storageId || modelField.field.id;
|
|
165
189
|
}
|
|
166
190
|
|
|
167
191
|
return modelField.isSystemField || !parentPath || path.match(parentPath) ? path : `${parentPath}.${path}`;
|
|
@@ -191,6 +215,149 @@ const hasKeyword = modelField => {
|
|
|
191
215
|
|
|
192
216
|
return true;
|
|
193
217
|
};
|
|
218
|
+
|
|
219
|
+
/**
|
|
220
|
+
* A list of typeof strings that are 100% not ref field filtering.
|
|
221
|
+
* We also need to check for array and date.
|
|
222
|
+
*/
|
|
223
|
+
const nonRefFieldTypes = ["string", "number", "undefined", "symbol", "bigint", "function", "boolean"];
|
|
224
|
+
|
|
225
|
+
const isRefFieldFiltering = params => {
|
|
226
|
+
const {
|
|
227
|
+
key,
|
|
228
|
+
value,
|
|
229
|
+
field
|
|
230
|
+
} = params;
|
|
231
|
+
const typeOf = typeof value;
|
|
232
|
+
|
|
233
|
+
if (!value || nonRefFieldTypes.includes(typeOf) || Array.isArray(value) || value instanceof Date || !!value.toISOString) {
|
|
234
|
+
return false;
|
|
235
|
+
} else if (typeOf === "object" && field.type === "ref") {
|
|
236
|
+
return true;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
throw new _error.default("Could not determine if the search value is ref field search.", "REF_FIELD_SEARCH_ERROR", {
|
|
240
|
+
value,
|
|
241
|
+
field,
|
|
242
|
+
key
|
|
243
|
+
});
|
|
244
|
+
};
|
|
245
|
+
|
|
246
|
+
const fieldPathFactory = params => {
|
|
247
|
+
const {
|
|
248
|
+
plugin,
|
|
249
|
+
modelField,
|
|
250
|
+
value,
|
|
251
|
+
parentPath,
|
|
252
|
+
keyword,
|
|
253
|
+
key
|
|
254
|
+
} = params;
|
|
255
|
+
const field = modelField.field;
|
|
256
|
+
let fieldPath = null;
|
|
257
|
+
|
|
258
|
+
if (plugin) {
|
|
259
|
+
fieldPath = plugin.createPath({
|
|
260
|
+
field,
|
|
261
|
+
value,
|
|
262
|
+
key
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
if (!fieldPath) {
|
|
267
|
+
fieldPath = field.storageId;
|
|
268
|
+
|
|
269
|
+
if (modelField.path) {
|
|
270
|
+
fieldPath = typeof modelField.path === "function" ? modelField.path(value) : modelField.path;
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
const keywordValue = keyword ? ".keyword" : "";
|
|
275
|
+
|
|
276
|
+
if (!parentPath) {
|
|
277
|
+
return `${fieldPath}${keywordValue}`;
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
return `${parentPath}.${fieldPath}${keywordValue}`;
|
|
281
|
+
};
|
|
282
|
+
|
|
283
|
+
const applyFiltering = params => {
|
|
284
|
+
const {
|
|
285
|
+
query,
|
|
286
|
+
modelField,
|
|
287
|
+
operator,
|
|
288
|
+
key,
|
|
289
|
+
value: initialValue,
|
|
290
|
+
operatorPlugins,
|
|
291
|
+
searchPlugins,
|
|
292
|
+
parentPath
|
|
293
|
+
} = params;
|
|
294
|
+
const plugin = operatorPlugins[operator];
|
|
295
|
+
|
|
296
|
+
if (!plugin) {
|
|
297
|
+
throw new _error.default("Operator plugin missing.", "PLUGIN_MISSING", {
|
|
298
|
+
operator
|
|
299
|
+
});
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
const fieldSearchPlugin = searchPlugins[modelField.type];
|
|
303
|
+
const value = (0, _transformValueForSearch.transformValueForSearch)({
|
|
304
|
+
plugins: searchPlugins,
|
|
305
|
+
field: modelField.field,
|
|
306
|
+
value: initialValue
|
|
307
|
+
});
|
|
308
|
+
const keyword = hasKeyword(modelField);
|
|
309
|
+
plugin.apply(query, {
|
|
310
|
+
basePath: fieldPathFactory({
|
|
311
|
+
plugin: fieldSearchPlugin,
|
|
312
|
+
modelField,
|
|
313
|
+
parentPath: modelField.isSystemField ? null : parentPath,
|
|
314
|
+
value,
|
|
315
|
+
key
|
|
316
|
+
}),
|
|
317
|
+
path: fieldPathFactory({
|
|
318
|
+
plugin: fieldSearchPlugin,
|
|
319
|
+
modelField,
|
|
320
|
+
value,
|
|
321
|
+
parentPath: modelField.isSystemField ? null : parentPath,
|
|
322
|
+
keyword,
|
|
323
|
+
key
|
|
324
|
+
}),
|
|
325
|
+
value,
|
|
326
|
+
keyword
|
|
327
|
+
});
|
|
328
|
+
};
|
|
329
|
+
|
|
330
|
+
const applyFullTextSearch = params => {
|
|
331
|
+
const {
|
|
332
|
+
query,
|
|
333
|
+
modelFields,
|
|
334
|
+
term,
|
|
335
|
+
fields
|
|
336
|
+
} = params;
|
|
337
|
+
|
|
338
|
+
if (!term || term.length === 0 || fields.length === 0) {
|
|
339
|
+
return;
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
const fieldPaths = fields.reduce((collection, field) => {
|
|
343
|
+
const modelField = modelFields[field.fieldId];
|
|
344
|
+
|
|
345
|
+
if (!modelField) {
|
|
346
|
+
return collection;
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
collection.push(`values.${field.storageId}`);
|
|
350
|
+
return collection;
|
|
351
|
+
}, []);
|
|
352
|
+
query.must.push({
|
|
353
|
+
query_string: {
|
|
354
|
+
allow_leading_wildcard: true,
|
|
355
|
+
fields: fieldPaths,
|
|
356
|
+
query: (0, _apiElasticsearch.normalizeValue)(term),
|
|
357
|
+
default_operator: "or"
|
|
358
|
+
}
|
|
359
|
+
});
|
|
360
|
+
};
|
|
194
361
|
/*
|
|
195
362
|
* Iterate through where keys and apply plugins where necessary
|
|
196
363
|
*/
|
|
@@ -198,18 +365,28 @@ const hasKeyword = modelField => {
|
|
|
198
365
|
|
|
199
366
|
const execElasticsearchBuildQueryPlugins = params => {
|
|
200
367
|
const {
|
|
368
|
+
model,
|
|
201
369
|
where: initialWhere,
|
|
202
370
|
modelFields,
|
|
203
371
|
parentPath,
|
|
204
372
|
plugins,
|
|
205
|
-
searchPlugins
|
|
373
|
+
searchPlugins,
|
|
374
|
+
fullTextSearch
|
|
206
375
|
} = params;
|
|
207
|
-
|
|
208
|
-
const
|
|
209
|
-
|
|
210
|
-
const query = createInitialQueryValue(_objectSpread(_objectSpread({}, params), {}, {
|
|
376
|
+
const where = (0, _objectSpread2.default)({}, initialWhere);
|
|
377
|
+
const query = createInitialQueryValue((0, _objectSpread2.default)((0, _objectSpread2.default)({}, params), {}, {
|
|
211
378
|
where
|
|
212
379
|
}));
|
|
380
|
+
/**
|
|
381
|
+
* Add full text search for requested fields.
|
|
382
|
+
*/
|
|
383
|
+
|
|
384
|
+
applyFullTextSearch({
|
|
385
|
+
query,
|
|
386
|
+
modelFields,
|
|
387
|
+
term: fullTextSearch.term,
|
|
388
|
+
fields: fullTextSearch.fields
|
|
389
|
+
});
|
|
213
390
|
/**
|
|
214
391
|
* Always remove special fields, as these do not exist in Elasticsearch.
|
|
215
392
|
*/
|
|
@@ -222,7 +399,7 @@ const execElasticsearchBuildQueryPlugins = params => {
|
|
|
222
399
|
return query;
|
|
223
400
|
}
|
|
224
401
|
|
|
225
|
-
const operatorPlugins = (0,
|
|
402
|
+
const operatorPlugins = (0, _apiElasticsearch.getElasticsearchOperatorPluginsByLocale)(plugins, model.locale);
|
|
226
403
|
|
|
227
404
|
for (const key in where) {
|
|
228
405
|
if (where.hasOwnProperty(key) === false) {
|
|
@@ -232,20 +409,39 @@ const execElasticsearchBuildQueryPlugins = params => {
|
|
|
232
409
|
* We do not need to go further if value is undefined.
|
|
233
410
|
* There are few hardcoded possibilities when value is undefined, for example, ownedBy.
|
|
234
411
|
*/
|
|
412
|
+
// TODO figure out how to have type.
|
|
413
|
+
|
|
235
414
|
|
|
415
|
+
const value = where[key];
|
|
236
416
|
|
|
237
|
-
if (
|
|
417
|
+
if (value === undefined) {
|
|
238
418
|
continue;
|
|
239
419
|
}
|
|
240
420
|
|
|
241
421
|
const {
|
|
242
422
|
field,
|
|
243
423
|
operator
|
|
244
|
-
} = (0,
|
|
245
|
-
|
|
424
|
+
} = (0, _apiElasticsearch.parseWhereKey)(key);
|
|
425
|
+
/**
|
|
426
|
+
* TODO This will be required until the storage operations receive the fieldId instead of field storageId.
|
|
427
|
+
* TODO For this to work without field searching, we need to refactor how the query looks like.
|
|
428
|
+
*
|
|
429
|
+
* Storage operations should NEVER receive an field storageId, only alias - fieldId.
|
|
430
|
+
*/
|
|
431
|
+
|
|
432
|
+
let fieldId = field;
|
|
433
|
+
const cmsModelField = findFieldByFieldId(model, fieldId);
|
|
434
|
+
|
|
435
|
+
if (!cmsModelField && !modelFields[fieldId]) {
|
|
436
|
+
throw new _error.default(`There is no CMS Model Field field "${fieldId}".`);
|
|
437
|
+
} else if (cmsModelField) {
|
|
438
|
+
fieldId = cmsModelField.fieldId;
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
const modelField = modelFields[fieldId];
|
|
246
442
|
|
|
247
443
|
if (!modelField) {
|
|
248
|
-
throw new _error.default(`There is no field "${
|
|
444
|
+
throw new _error.default(`There is no field "${fieldId}".`);
|
|
249
445
|
}
|
|
250
446
|
|
|
251
447
|
const {
|
|
@@ -254,34 +450,50 @@ const execElasticsearchBuildQueryPlugins = params => {
|
|
|
254
450
|
} = modelField;
|
|
255
451
|
|
|
256
452
|
if (!isSearchable) {
|
|
257
|
-
throw new _error.default(`Field "${
|
|
453
|
+
throw new _error.default(`Field "${fieldId}" is not searchable.`);
|
|
258
454
|
}
|
|
455
|
+
/**
|
|
456
|
+
* There is a possibility that value is an object.
|
|
457
|
+
* In that case, check if field is ref field and continue a bit differently.
|
|
458
|
+
*/
|
|
459
|
+
|
|
259
460
|
|
|
260
|
-
|
|
461
|
+
if (isRefFieldFiltering({
|
|
462
|
+
key,
|
|
463
|
+
value,
|
|
464
|
+
field: cmsField
|
|
465
|
+
})) {
|
|
466
|
+
/**
|
|
467
|
+
* We we need to go through each key in where[key] to determine the filters.
|
|
468
|
+
*/
|
|
469
|
+
for (const whereKey in value) {
|
|
470
|
+
const {
|
|
471
|
+
operator
|
|
472
|
+
} = (0, _apiElasticsearch.parseWhereKey)(whereKey);
|
|
473
|
+
applyFiltering({
|
|
474
|
+
query,
|
|
475
|
+
modelField,
|
|
476
|
+
operator,
|
|
477
|
+
key: whereKey,
|
|
478
|
+
value: value[whereKey],
|
|
479
|
+
searchPlugins,
|
|
480
|
+
operatorPlugins,
|
|
481
|
+
parentPath
|
|
482
|
+
});
|
|
483
|
+
}
|
|
261
484
|
|
|
262
|
-
|
|
263
|
-
throw new _error.default("Operator plugin missing.", "PLUGIN_MISSING", {
|
|
264
|
-
operator
|
|
265
|
-
});
|
|
485
|
+
continue;
|
|
266
486
|
}
|
|
267
487
|
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
plugins: searchPlugins,
|
|
271
|
-
field: cmsField,
|
|
272
|
-
value: where[key]
|
|
273
|
-
});
|
|
274
|
-
const fieldPath = createFieldPath({
|
|
275
|
-
searchPlugin: fieldSearchPlugin,
|
|
488
|
+
applyFiltering({
|
|
489
|
+
query,
|
|
276
490
|
modelField,
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
const keyword = hasKeyword(modelField);
|
|
280
|
-
plugin.apply(query, {
|
|
281
|
-
basePath: fieldPath,
|
|
282
|
-
path: keyword ? `${fieldPath}.keyword` : fieldPath,
|
|
491
|
+
operator,
|
|
492
|
+
key,
|
|
283
493
|
value,
|
|
284
|
-
|
|
494
|
+
searchPlugins,
|
|
495
|
+
operatorPlugins,
|
|
496
|
+
parentPath
|
|
285
497
|
});
|
|
286
498
|
}
|
|
287
499
|
|
|
@@ -296,20 +508,43 @@ const createElasticsearchQueryBody = params => {
|
|
|
296
508
|
parentPath = null
|
|
297
509
|
} = params;
|
|
298
510
|
const {
|
|
299
|
-
where,
|
|
511
|
+
where = {},
|
|
300
512
|
after,
|
|
301
513
|
limit,
|
|
302
|
-
sort: initialSort
|
|
514
|
+
sort: initialSort,
|
|
515
|
+
search,
|
|
516
|
+
fields = []
|
|
303
517
|
} = args;
|
|
304
518
|
const modelFields = (0, _fields.createModelFields)(plugins, model);
|
|
305
519
|
const searchPlugins = (0, _searchPluginsList.searchPluginsList)(plugins);
|
|
520
|
+
const fullTextSearchFields = [];
|
|
521
|
+
/**
|
|
522
|
+
* No point in going through fields if there is no search performed.
|
|
523
|
+
*/
|
|
524
|
+
|
|
525
|
+
if (!!search) {
|
|
526
|
+
for (const fieldId of fields) {
|
|
527
|
+
const field = model.fields.find(f => f.fieldId === fieldId);
|
|
528
|
+
|
|
529
|
+
if (!field) {
|
|
530
|
+
continue;
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
fullTextSearchFields.push(field);
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
|
|
306
537
|
const query = execElasticsearchBuildQueryPlugins({
|
|
307
538
|
model,
|
|
308
539
|
plugins,
|
|
309
540
|
where,
|
|
310
541
|
modelFields,
|
|
311
542
|
parentPath,
|
|
312
|
-
searchPlugins
|
|
543
|
+
searchPlugins,
|
|
544
|
+
fullTextSearch: {
|
|
545
|
+
term: search,
|
|
546
|
+
fields: fullTextSearchFields
|
|
547
|
+
}
|
|
313
548
|
});
|
|
314
549
|
const queryPlugins = plugins.byType(_CmsEntryElasticsearchQueryModifierPlugin.CmsEntryElasticsearchQueryModifierPlugin.type).filter(pl => {
|
|
315
550
|
return !pl.modelId || pl.modelId === model.modelId;
|
|
@@ -352,9 +587,9 @@ const createElasticsearchQueryBody = params => {
|
|
|
352
587
|
}
|
|
353
588
|
},
|
|
354
589
|
sort,
|
|
355
|
-
size: limit + 1,
|
|
590
|
+
size: (limit || 0) + 1,
|
|
356
591
|
// eslint-disable-next-line
|
|
357
|
-
search_after: (0,
|
|
592
|
+
search_after: (0, _apiElasticsearch.decodeCursor)(after),
|
|
358
593
|
// eslint-disable-next-line
|
|
359
594
|
track_total_hits: true
|
|
360
595
|
};
|
|
@@ -365,7 +600,8 @@ const createElasticsearchQueryBody = params => {
|
|
|
365
600
|
for (const pl of bodyPlugins) {
|
|
366
601
|
pl.modifyBody({
|
|
367
602
|
body,
|
|
368
|
-
model
|
|
603
|
+
model,
|
|
604
|
+
where
|
|
369
605
|
});
|
|
370
606
|
}
|
|
371
607
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["specialFields","noKeywordFields","createElasticsearchSortParams","args","sort","modelFields","parentPath","searchPlugins","length","fieldIdToStorageIdIdMap","sortPlugins","Object","values","reduce","plugins","modelField","searchPlugin","type","fieldId","storageId","field","CmsEntryElasticsearchFieldPlugin","unmappedType","keyword","hasKeyword","sortable","isSortable","searchable","isSearchable","path","createFieldPath","key","transformedSort","map","value","matched","match","order","filter","Boolean","createSort","fieldPlugins","findFieldByFieldId","model","fields","find","createInitialQueryValue","params","where","initialWhere","query","must","must_not","should","sharedIndex","process","env","ELASTICSEARCH_SHARED_INDEXES","push","term","tenant","locale","published","createPublishedType","latest","createLatestType","WebinyError","createPath","id","isSystemField","includes","nonRefFieldTypes","isRefFieldFiltering","typeOf","Array","isArray","Date","toISOString","fieldPathFactory","plugin","fieldPath","keywordValue","applyFiltering","operator","initialValue","operatorPlugins","fieldSearchPlugin","transformValueForSearch","apply","basePath","applyFullTextSearch","fieldPaths","collection","query_string","allow_leading_wildcard","normalizeValue","default_operator","execElasticsearchBuildQueryPlugins","fullTextSearch","sf","keys","getElasticsearchOperatorPluginsByLocale","hasOwnProperty","undefined","parseWhereKey","cmsModelField","cmsField","whereKey","createElasticsearchQueryBody","after","limit","initialSort","search","createModelFields","searchPluginsList","fullTextSearchFields","f","queryPlugins","byType","CmsEntryElasticsearchQueryModifierPlugin","pl","modelId","modifyQuery","CmsEntryElasticsearchSortModifierPlugin","modifySort","body","bool","size","search_after","decodeCursor","track_total_hits","bodyPlugins","CmsEntryElasticsearchBodyModifierPlugin","modifyBody"],"sources":["createElasticsearchQueryBody.ts"],"sourcesContent":["import WebinyError from \"@webiny/error\";\nimport { transformValueForSearch } from \"./transformValueForSearch\";\nimport { searchPluginsList } from \"./searchPluginsList\";\nimport {\n CmsEntryListParams,\n CmsEntryListSort,\n CmsEntryListWhere,\n CmsModel,\n CmsModelField\n} from \"@webiny/api-headless-cms/types\";\nimport {\n SearchBody as esSearchBody,\n Sort as esSort,\n ElasticsearchBoolQueryConfig\n} from \"@webiny/api-elasticsearch/types\";\nimport {\n decodeCursor,\n createSort,\n parseWhereKey,\n ElasticsearchQueryBuilderOperatorPlugin,\n normalizeValue,\n getElasticsearchOperatorPluginsByLocale\n} from \"@webiny/api-elasticsearch\";\nimport { createModelFields, ModelField, ModelFields } from \"./fields\";\nimport { CmsEntryElasticsearchFieldPlugin } from \"~/plugins/CmsEntryElasticsearchFieldPlugin\";\nimport { PluginsContainer } from \"@webiny/plugins\";\nimport { createLatestType, createPublishedType } from \"~/operations/entry\";\nimport { CmsEntryElasticsearchQueryModifierPlugin } from \"~/plugins/CmsEntryElasticsearchQueryModifierPlugin\";\nimport { CmsEntryElasticsearchSortModifierPlugin } from \"~/plugins/CmsEntryElasticsearchSortModifierPlugin\";\nimport { CmsEntryElasticsearchBodyModifierPlugin } from \"~/plugins/CmsEntryElasticsearchBodyModifierPlugin\";\nimport {\n CmsEntryElasticsearchQueryBuilderValueSearchPlugin,\n CreatePathCallableParams\n} from \"~/plugins/CmsEntryElasticsearchQueryBuilderValueSearchPlugin\";\n\ninterface CreateElasticsearchParams {\n plugins: PluginsContainer;\n model: CmsModel;\n args: CmsEntryListParams;\n parentPath?: string;\n}\n\ninterface CreateElasticsearchSortParams {\n plugins: PluginsContainer;\n sort?: CmsEntryListSort;\n modelFields: ModelFields;\n parentPath?: string | null;\n model: CmsModel;\n searchPlugins: Record<string, CmsEntryElasticsearchQueryBuilderValueSearchPlugin>;\n}\n\ninterface CreateElasticsearchQueryArgs {\n model: CmsModel;\n plugins: PluginsContainer;\n where: CmsEntryListWhere;\n modelFields: ModelFields;\n parentPath?: string | null;\n searchPlugins: Record<string, CmsEntryElasticsearchQueryBuilderValueSearchPlugin>;\n fullTextSearch: {\n term?: string;\n fields: CmsModelField[];\n };\n}\n\nconst specialFields: (keyof Partial<CmsEntryListWhere>)[] = [\"published\", \"latest\"];\nconst noKeywordFields = [\"date\", \"datetime\", \"number\", \"boolean\"];\n\nconst createElasticsearchSortParams = (args: CreateElasticsearchSortParams): esSort => {\n const { sort, modelFields, parentPath, searchPlugins } = args;\n\n if (!sort || sort.length === 0) {\n return [];\n }\n\n const fieldIdToStorageIdIdMap: Record<string, string> = {};\n\n const sortPlugins = Object.values(modelFields).reduce((plugins, modelField) => {\n const searchPlugin = searchPlugins[modelField.type];\n\n const { fieldId, storageId } = modelField.field;\n\n fieldIdToStorageIdIdMap[fieldId] = fieldId;\n /**\n * Plugins must be stored with fieldId as key because it is later used to find the sorting plugin.\n */\n plugins[fieldId] = new CmsEntryElasticsearchFieldPlugin({\n unmappedType: modelField.unmappedType,\n keyword: hasKeyword(modelField),\n sortable: modelField.isSortable,\n searchable: modelField.isSearchable,\n field: fieldId,\n path: createFieldPath({\n key: storageId,\n parentPath,\n modelField,\n searchPlugin\n })\n });\n return plugins;\n }, {} as Record<string, CmsEntryElasticsearchFieldPlugin>);\n\n const transformedSort = sort\n .map(value => {\n const matched = value.match(/^([a-zA-Z-0-9_]+)_(ASC|DESC)$/);\n if (!matched) {\n return null;\n }\n const [, fieldId, order] = matched;\n if (fieldIdToStorageIdIdMap[fieldId]) {\n return `${fieldIdToStorageIdIdMap[fieldId]}_${order}`;\n }\n\n return value;\n })\n .filter(Boolean) as string[];\n return createSort({\n fieldPlugins: sortPlugins,\n sort: transformedSort\n });\n};\n\nconst findFieldByFieldId = (model: CmsModel, fieldId: string): CmsModelField | undefined => {\n return model.fields.find(field => {\n return field.fieldId === fieldId;\n });\n};\n/**\n * Latest and published are specific in Elasticsearch to that extend that they are tagged in the __type property.\n * We allow either published or either latest.\n * Latest is used in the manage API and published in the read API.\n */\nconst createInitialQueryValue = (\n params: CreateElasticsearchQueryArgs\n): ElasticsearchBoolQueryConfig => {\n const { model, where: initialWhere } = params;\n /**\n * Cast as partial so we can remove unnecessary keys.\n */\n const where: CmsEntryListWhere = {\n ...initialWhere\n };\n\n const query: ElasticsearchBoolQueryConfig = {\n must: [],\n must_not: [],\n should: [],\n filter: []\n };\n\n // When ES index is shared between tenants, we need to filter records by tenant ID\n const sharedIndex = process.env.ELASTICSEARCH_SHARED_INDEXES === \"true\";\n if (sharedIndex) {\n query.must.push({ term: { \"tenant.keyword\": model.tenant } });\n }\n\n query.must.push({\n term: {\n \"locale.keyword\": model.locale\n }\n });\n\n /**\n * We must transform published and latest where args into something that is understandable by our Elasticsearch\n */\n if (where.published === true) {\n query.must.push({\n term: {\n \"__type.keyword\": createPublishedType()\n }\n });\n } else if (where.latest === true) {\n query.must.push({\n term: {\n \"__type.keyword\": createLatestType()\n }\n });\n }\n // we do not allow not published and not latest\n else {\n throw new WebinyError(\n `Cannot call Elasticsearch query when not setting \"published\" or \"latest\".`,\n \"ELASTICSEARCH_UNSUPPORTED_QUERY\",\n {\n where\n }\n );\n }\n //\n return query;\n};\n\ninterface CreateFieldPathParams {\n modelField: ModelField;\n key: string;\n searchPlugin?: CmsEntryElasticsearchQueryBuilderValueSearchPlugin;\n parentPath?: string | null;\n}\nconst createFieldPath = ({\n modelField,\n searchPlugin,\n parentPath,\n key\n}: CreateFieldPathParams): string => {\n let path: string | null = null;\n if (searchPlugin && typeof searchPlugin.createPath === \"function\") {\n path = searchPlugin.createPath({\n field: modelField.field,\n value: null,\n key\n });\n } else if (typeof modelField.path === \"function\") {\n path = modelField.path(modelField.field.storageId);\n }\n if (!path) {\n /**\n * We know that modelFieldPath is a string or undefined at this point.\n */\n path = (modelField.path as string) || modelField.field.storageId || modelField.field.id;\n }\n return modelField.isSystemField || !parentPath || path.match(parentPath)\n ? path\n : `${parentPath}.${path}`;\n};\n\nconst hasKeyword = (modelField: ModelField): boolean => {\n /**\n * We defined some field types that MUST have no keyword added to the field path\n */\n if (noKeywordFields.includes(modelField.type)) {\n return false;\n } else if (modelField.unmappedType) {\n /**\n * If modelField has unmapped type defined, do not add keyword.\n */\n return false;\n } else if (modelField.keyword === false) {\n /**\n * And if specifically defined that modelField has no keyword, do not add it.\n */\n return false;\n }\n /**\n * All other fields have keyword added.\n */\n return true;\n};\n\ninterface IsRefFieldFilteringParams {\n key: string;\n value: any;\n field: CmsModelField;\n}\n\n/**\n * A list of typeof strings that are 100% not ref field filtering.\n * We also need to check for array and date.\n */\nconst nonRefFieldTypes: string[] = [\n \"string\",\n \"number\",\n \"undefined\",\n \"symbol\",\n \"bigint\",\n \"function\",\n \"boolean\"\n];\nconst isRefFieldFiltering = (params: IsRefFieldFilteringParams): boolean => {\n const { key, value, field } = params;\n const typeOf = typeof value;\n if (\n !value ||\n nonRefFieldTypes.includes(typeOf) ||\n Array.isArray(value) ||\n value instanceof Date ||\n !!value.toISOString\n ) {\n return false;\n } else if (typeOf === \"object\" && field.type === \"ref\") {\n return true;\n }\n throw new WebinyError(\n \"Could not determine if the search value is ref field search.\",\n \"REF_FIELD_SEARCH_ERROR\",\n {\n value,\n field,\n key\n }\n );\n};\n\ninterface FieldPathFactoryParams extends Omit<CreatePathCallableParams, \"field\"> {\n plugin?: CmsEntryElasticsearchQueryBuilderValueSearchPlugin;\n modelField: ModelField;\n key: string;\n parentPath?: string | null;\n keyword?: boolean;\n}\nconst fieldPathFactory = (params: FieldPathFactoryParams): string => {\n const { plugin, modelField, value, parentPath, keyword, key } = params;\n\n const field = modelField.field;\n\n let fieldPath: string | null = null;\n if (plugin) {\n fieldPath = plugin.createPath({ field, value, key });\n }\n if (!fieldPath) {\n fieldPath = field.storageId;\n if (modelField.path) {\n fieldPath =\n typeof modelField.path === \"function\" ? modelField.path(value) : modelField.path;\n }\n }\n\n const keywordValue = keyword ? \".keyword\" : \"\";\n if (!parentPath) {\n return `${fieldPath}${keywordValue}`;\n }\n return `${parentPath}.${fieldPath}${keywordValue}`;\n};\n\ninterface ApplyFilteringParams {\n query: ElasticsearchBoolQueryConfig;\n modelField: ModelField;\n operator: string;\n key: string;\n value: any;\n operatorPlugins: Record<string, ElasticsearchQueryBuilderOperatorPlugin>;\n searchPlugins: Record<string, CmsEntryElasticsearchQueryBuilderValueSearchPlugin>;\n parentPath?: string | null;\n}\nconst applyFiltering = (params: ApplyFilteringParams) => {\n const {\n query,\n modelField,\n operator,\n key,\n value: initialValue,\n operatorPlugins,\n searchPlugins,\n parentPath\n } = params;\n const plugin = operatorPlugins[operator];\n if (!plugin) {\n throw new WebinyError(\"Operator plugin missing.\", \"PLUGIN_MISSING\", {\n operator\n });\n }\n const fieldSearchPlugin = searchPlugins[modelField.type];\n const value = transformValueForSearch({\n plugins: searchPlugins,\n field: modelField.field,\n value: initialValue\n });\n\n const keyword = hasKeyword(modelField);\n plugin.apply(query, {\n basePath: fieldPathFactory({\n plugin: fieldSearchPlugin,\n modelField,\n parentPath: modelField.isSystemField ? null : parentPath,\n value,\n key\n }),\n path: fieldPathFactory({\n plugin: fieldSearchPlugin,\n modelField,\n value,\n parentPath: modelField.isSystemField ? null : parentPath,\n keyword,\n key\n }),\n value,\n keyword\n });\n};\n\ninterface ApplyFullTextSearchParams {\n query: ElasticsearchBoolQueryConfig;\n modelFields: ModelFields;\n term?: string;\n fields: CmsModelField[];\n}\nconst applyFullTextSearch = (params: ApplyFullTextSearchParams): void => {\n const { query, modelFields, term, fields } = params;\n if (!term || term.length === 0 || fields.length === 0) {\n return;\n }\n\n const fieldPaths = fields.reduce((collection, field) => {\n const modelField = modelFields[field.fieldId];\n if (!modelField) {\n return collection;\n }\n\n collection.push(`values.${field.storageId}`);\n\n return collection;\n }, [] as string[]);\n\n query.must.push({\n query_string: {\n allow_leading_wildcard: true,\n fields: fieldPaths,\n query: normalizeValue(term),\n default_operator: \"or\"\n }\n });\n};\n\n/*\n * Iterate through where keys and apply plugins where necessary\n */\nconst execElasticsearchBuildQueryPlugins = (\n params: CreateElasticsearchQueryArgs\n): ElasticsearchBoolQueryConfig => {\n const {\n model,\n where: initialWhere,\n modelFields,\n parentPath,\n plugins,\n searchPlugins,\n fullTextSearch\n } = params;\n\n const where: Partial<CmsEntryListWhere> = {\n ...initialWhere\n };\n const query = createInitialQueryValue({\n ...params,\n where\n });\n\n /**\n * Add full text search for requested fields.\n */\n applyFullTextSearch({\n query,\n modelFields,\n term: fullTextSearch.term,\n fields: fullTextSearch.fields\n });\n\n /**\n * Always remove special fields, as these do not exist in Elasticsearch.\n */\n for (const sf of specialFields) {\n delete where[sf];\n }\n\n if (Object.keys(where).length === 0) {\n return query;\n }\n\n const operatorPlugins = getElasticsearchOperatorPluginsByLocale(plugins, model.locale);\n\n for (const key in where) {\n if (where.hasOwnProperty(key) === false) {\n continue;\n }\n /**\n * We do not need to go further if value is undefined.\n * There are few hardcoded possibilities when value is undefined, for example, ownedBy.\n */\n // TODO figure out how to have type.\n const value = (where as any)[key];\n if (value === undefined) {\n continue;\n }\n const { field, operator } = parseWhereKey(key);\n /**\n * TODO This will be required until the storage operations receive the fieldId instead of field storageId.\n * TODO For this to work without field searching, we need to refactor how the query looks like.\n *\n * Storage operations should NEVER receive an field storageId, only alias - fieldId.\n */\n\n let fieldId = field;\n const cmsModelField = findFieldByFieldId(model, fieldId);\n if (!cmsModelField && !modelFields[fieldId]) {\n throw new WebinyError(`There is no CMS Model Field field \"${fieldId}\".`);\n } else if (cmsModelField) {\n fieldId = cmsModelField.fieldId;\n }\n\n const modelField = modelFields[fieldId];\n\n if (!modelField) {\n throw new WebinyError(`There is no field \"${fieldId}\".`);\n }\n const { isSearchable = false, field: cmsField } = modelField;\n if (!isSearchable) {\n throw new WebinyError(`Field \"${fieldId}\" is not searchable.`);\n }\n /**\n * There is a possibility that value is an object.\n * In that case, check if field is ref field and continue a bit differently.\n */\n if (isRefFieldFiltering({ key, value, field: cmsField })) {\n /**\n * We we need to go through each key in where[key] to determine the filters.\n */\n for (const whereKey in value) {\n const { operator } = parseWhereKey(whereKey);\n applyFiltering({\n query,\n modelField,\n operator,\n key: whereKey,\n value: value[whereKey],\n searchPlugins,\n operatorPlugins,\n parentPath\n });\n }\n continue;\n }\n applyFiltering({\n query,\n modelField,\n operator,\n key,\n value,\n searchPlugins,\n operatorPlugins,\n parentPath\n });\n }\n\n return query;\n};\n\nexport const createElasticsearchQueryBody = (params: CreateElasticsearchParams): esSearchBody => {\n const { plugins, model, args, parentPath = null } = params;\n const { where = {}, after, limit, sort: initialSort, search, fields = [] } = args;\n\n const modelFields = createModelFields(plugins, model);\n const searchPlugins = searchPluginsList(plugins);\n\n const fullTextSearchFields: CmsModelField[] = [];\n /**\n * No point in going through fields if there is no search performed.\n */\n if (!!search) {\n for (const fieldId of fields) {\n const field = model.fields.find(f => f.fieldId === fieldId);\n if (!field) {\n continue;\n }\n fullTextSearchFields.push(field);\n }\n }\n\n const query = execElasticsearchBuildQueryPlugins({\n model,\n plugins,\n where,\n modelFields,\n parentPath,\n searchPlugins,\n fullTextSearch: {\n term: search,\n fields: fullTextSearchFields\n }\n });\n\n const queryPlugins = plugins\n .byType<CmsEntryElasticsearchQueryModifierPlugin>(\n CmsEntryElasticsearchQueryModifierPlugin.type\n )\n .filter(pl => {\n return !pl.modelId || pl.modelId === model.modelId;\n });\n for (const pl of queryPlugins) {\n pl.modifyQuery({ query, model, where });\n }\n\n const sort = createElasticsearchSortParams({\n plugins,\n sort: initialSort,\n modelFields,\n parentPath,\n model,\n searchPlugins\n });\n\n const sortPlugins = plugins\n .byType<CmsEntryElasticsearchSortModifierPlugin>(\n CmsEntryElasticsearchSortModifierPlugin.type\n )\n .filter(pl => {\n return !pl.modelId || pl.modelId === model.modelId;\n });\n for (const pl of sortPlugins) {\n pl.modifySort({\n sort,\n model\n });\n }\n\n const body: esSearchBody = {\n query: {\n bool: {\n must: query.must.length > 0 ? query.must : undefined,\n must_not: query.must_not.length > 0 ? query.must_not : undefined,\n should: query.should.length > 0 ? query.should : undefined,\n filter: query.filter.length > 0 ? query.filter : undefined\n }\n },\n sort,\n size: (limit || 0) + 1,\n // eslint-disable-next-line\n search_after: decodeCursor(after) as any,\n // eslint-disable-next-line\n track_total_hits: true\n };\n\n const bodyPlugins = plugins\n .byType<CmsEntryElasticsearchBodyModifierPlugin>(\n CmsEntryElasticsearchBodyModifierPlugin.type\n )\n .filter(pl => {\n return !pl.modelId || pl.modelId === model.modelId;\n });\n for (const pl of bodyPlugins) {\n pl.modifyBody({\n body,\n model,\n where\n });\n }\n\n return body;\n};\n"],"mappings":";;;;;;;;;;;AAAA;;AACA;;AACA;;AAaA;;AAQA;;AACA;;AAEA;;AACA;;AACA;;AACA;;AAmCA,MAAMA,aAAmD,GAAG,CAAC,WAAD,EAAc,QAAd,CAA5D;AACA,MAAMC,eAAe,GAAG,CAAC,MAAD,EAAS,UAAT,EAAqB,QAArB,EAA+B,SAA/B,CAAxB;;AAEA,MAAMC,6BAA6B,GAAIC,IAAD,IAAiD;EACnF,MAAM;IAAEC,IAAF;IAAQC,WAAR;IAAqBC,UAArB;IAAiCC;EAAjC,IAAmDJ,IAAzD;;EAEA,IAAI,CAACC,IAAD,IAASA,IAAI,CAACI,MAAL,KAAgB,CAA7B,EAAgC;IAC5B,OAAO,EAAP;EACH;;EAED,MAAMC,uBAA+C,GAAG,EAAxD;EAEA,MAAMC,WAAW,GAAGC,MAAM,CAACC,MAAP,CAAcP,WAAd,EAA2BQ,MAA3B,CAAkC,CAACC,OAAD,EAAUC,UAAV,KAAyB;IAC3E,MAAMC,YAAY,GAAGT,aAAa,CAACQ,UAAU,CAACE,IAAZ,CAAlC;IAEA,MAAM;MAAEC,OAAF;MAAWC;IAAX,IAAyBJ,UAAU,CAACK,KAA1C;IAEAX,uBAAuB,CAACS,OAAD,CAAvB,GAAmCA,OAAnC;IACA;AACR;AACA;;IACQJ,OAAO,CAACI,OAAD,CAAP,GAAmB,IAAIG,kEAAJ,CAAqC;MACpDC,YAAY,EAAEP,UAAU,CAACO,YAD2B;MAEpDC,OAAO,EAAEC,UAAU,CAACT,UAAD,CAFiC;MAGpDU,QAAQ,EAAEV,UAAU,CAACW,UAH+B;MAIpDC,UAAU,EAAEZ,UAAU,CAACa,YAJ6B;MAKpDR,KAAK,EAAEF,OAL6C;MAMpDW,IAAI,EAAEC,eAAe,CAAC;QAClBC,GAAG,EAAEZ,SADa;QAElBb,UAFkB;QAGlBS,UAHkB;QAIlBC;MAJkB,CAAD;IAN+B,CAArC,CAAnB;IAaA,OAAOF,OAAP;EACH,CAvBmB,EAuBjB,EAvBiB,CAApB;EAyBA,MAAMkB,eAAe,GAAG5B,IAAI,CACvB6B,GADmB,CACfC,KAAK,IAAI;IACV,MAAMC,OAAO,GAAGD,KAAK,CAACE,KAAN,CAAY,+BAAZ,CAAhB;;IACA,IAAI,CAACD,OAAL,EAAc;MACV,OAAO,IAAP;IACH;;IACD,MAAM,GAAGjB,OAAH,EAAYmB,KAAZ,IAAqBF,OAA3B;;IACA,IAAI1B,uBAAuB,CAACS,OAAD,CAA3B,EAAsC;MAClC,OAAQ,GAAET,uBAAuB,CAACS,OAAD,CAAU,IAAGmB,KAAM,EAApD;IACH;;IAED,OAAOH,KAAP;EACH,CAZmB,EAanBI,MAbmB,CAaZC,OAbY,CAAxB;EAcA,OAAO,IAAAC,4BAAA,EAAW;IACdC,YAAY,EAAE/B,WADA;IAEdN,IAAI,EAAE4B;EAFQ,CAAX,CAAP;AAIH,CApDD;;AAsDA,MAAMU,kBAAkB,GAAG,CAACC,KAAD,EAAkBzB,OAAlB,KAAiE;EACxF,OAAOyB,KAAK,CAACC,MAAN,CAAaC,IAAb,CAAkBzB,KAAK,IAAI;IAC9B,OAAOA,KAAK,CAACF,OAAN,KAAkBA,OAAzB;EACH,CAFM,CAAP;AAGH,CAJD;AAKA;AACA;AACA;AACA;AACA;;;AACA,MAAM4B,uBAAuB,GACzBC,MAD4B,IAEG;EAC/B,MAAM;IAAEJ,KAAF;IAASK,KAAK,EAAEC;EAAhB,IAAiCF,MAAvC;EACA;AACJ;AACA;;EACI,MAAMC,KAAwB,mCACvBC,YADuB,CAA9B;EAIA,MAAMC,KAAmC,GAAG;IACxCC,IAAI,EAAE,EADkC;IAExCC,QAAQ,EAAE,EAF8B;IAGxCC,MAAM,EAAE,EAHgC;IAIxCf,MAAM,EAAE;EAJgC,CAA5C,CAT+B,CAgB/B;;EACA,MAAMgB,WAAW,GAAGC,OAAO,CAACC,GAAR,CAAYC,4BAAZ,KAA6C,MAAjE;;EACA,IAAIH,WAAJ,EAAiB;IACbJ,KAAK,CAACC,IAAN,CAAWO,IAAX,CAAgB;MAAEC,IAAI,EAAE;QAAE,kBAAkBhB,KAAK,CAACiB;MAA1B;IAAR,CAAhB;EACH;;EAEDV,KAAK,CAACC,IAAN,CAAWO,IAAX,CAAgB;IACZC,IAAI,EAAE;MACF,kBAAkBhB,KAAK,CAACkB;IADtB;EADM,CAAhB;EAMA;AACJ;AACA;;EACI,IAAIb,KAAK,CAACc,SAAN,KAAoB,IAAxB,EAA8B;IAC1BZ,KAAK,CAACC,IAAN,CAAWO,IAAX,CAAgB;MACZC,IAAI,EAAE;QACF,kBAAkB,IAAAI,0BAAA;MADhB;IADM,CAAhB;EAKH,CAND,MAMO,IAAIf,KAAK,CAACgB,MAAN,KAAiB,IAArB,EAA2B;IAC9Bd,KAAK,CAACC,IAAN,CAAWO,IAAX,CAAgB;MACZC,IAAI,EAAE;QACF,kBAAkB,IAAAM,uBAAA;MADhB;IADM,CAAhB;EAKH,CANM,CAOP;EAPO,KAQF;IACD,MAAM,IAAIC,cAAJ,CACD,2EADC,EAEF,iCAFE,EAGF;MACIlB;IADJ,CAHE,CAAN;EAOH,CArD8B,CAsD/B;;;EACA,OAAOE,KAAP;AACH,CA1DD;;AAkEA,MAAMpB,eAAe,GAAG,CAAC;EACrBf,UADqB;EAErBC,YAFqB;EAGrBV,UAHqB;EAIrByB;AAJqB,CAAD,KAKa;EACjC,IAAIF,IAAmB,GAAG,IAA1B;;EACA,IAAIb,YAAY,IAAI,OAAOA,YAAY,CAACmD,UAApB,KAAmC,UAAvD,EAAmE;IAC/DtC,IAAI,GAAGb,YAAY,CAACmD,UAAb,CAAwB;MAC3B/C,KAAK,EAAEL,UAAU,CAACK,KADS;MAE3Bc,KAAK,EAAE,IAFoB;MAG3BH;IAH2B,CAAxB,CAAP;EAKH,CAND,MAMO,IAAI,OAAOhB,UAAU,CAACc,IAAlB,KAA2B,UAA/B,EAA2C;IAC9CA,IAAI,GAAGd,UAAU,CAACc,IAAX,CAAgBd,UAAU,CAACK,KAAX,CAAiBD,SAAjC,CAAP;EACH;;EACD,IAAI,CAACU,IAAL,EAAW;IACP;AACR;AACA;IACQA,IAAI,GAAId,UAAU,CAACc,IAAZ,IAA+Bd,UAAU,CAACK,KAAX,CAAiBD,SAAhD,IAA6DJ,UAAU,CAACK,KAAX,CAAiBgD,EAArF;EACH;;EACD,OAAOrD,UAAU,CAACsD,aAAX,IAA4B,CAAC/D,UAA7B,IAA2CuB,IAAI,CAACO,KAAL,CAAW9B,UAAX,CAA3C,GACDuB,IADC,GAEA,GAAEvB,UAAW,IAAGuB,IAAK,EAF5B;AAGH,CAzBD;;AA2BA,MAAML,UAAU,GAAIT,UAAD,IAAqC;EACpD;AACJ;AACA;EACI,IAAId,eAAe,CAACqE,QAAhB,CAAyBvD,UAAU,CAACE,IAApC,CAAJ,EAA+C;IAC3C,OAAO,KAAP;EACH,CAFD,MAEO,IAAIF,UAAU,CAACO,YAAf,EAA6B;IAChC;AACR;AACA;IACQ,OAAO,KAAP;EACH,CALM,MAKA,IAAIP,UAAU,CAACQ,OAAX,KAAuB,KAA3B,EAAkC;IACrC;AACR;AACA;IACQ,OAAO,KAAP;EACH;EACD;AACJ;AACA;;;EACI,OAAO,IAAP;AACH,CArBD;;AA6BA;AACA;AACA;AACA;AACA,MAAMgD,gBAA0B,GAAG,CAC/B,QAD+B,EAE/B,QAF+B,EAG/B,WAH+B,EAI/B,QAJ+B,EAK/B,QAL+B,EAM/B,UAN+B,EAO/B,SAP+B,CAAnC;;AASA,MAAMC,mBAAmB,GAAIzB,MAAD,IAAgD;EACxE,MAAM;IAAEhB,GAAF;IAAOG,KAAP;IAAcd;EAAd,IAAwB2B,MAA9B;EACA,MAAM0B,MAAM,GAAG,OAAOvC,KAAtB;;EACA,IACI,CAACA,KAAD,IACAqC,gBAAgB,CAACD,QAAjB,CAA0BG,MAA1B,CADA,IAEAC,KAAK,CAACC,OAAN,CAAczC,KAAd,CAFA,IAGAA,KAAK,YAAY0C,IAHjB,IAIA,CAAC,CAAC1C,KAAK,CAAC2C,WALZ,EAME;IACE,OAAO,KAAP;EACH,CARD,MAQO,IAAIJ,MAAM,KAAK,QAAX,IAAuBrD,KAAK,CAACH,IAAN,KAAe,KAA1C,EAAiD;IACpD,OAAO,IAAP;EACH;;EACD,MAAM,IAAIiD,cAAJ,CACF,8DADE,EAEF,wBAFE,EAGF;IACIhC,KADJ;IAEId,KAFJ;IAGIW;EAHJ,CAHE,CAAN;AASH,CAvBD;;AAgCA,MAAM+C,gBAAgB,GAAI/B,MAAD,IAA4C;EACjE,MAAM;IAAEgC,MAAF;IAAUhE,UAAV;IAAsBmB,KAAtB;IAA6B5B,UAA7B;IAAyCiB,OAAzC;IAAkDQ;EAAlD,IAA0DgB,MAAhE;EAEA,MAAM3B,KAAK,GAAGL,UAAU,CAACK,KAAzB;EAEA,IAAI4D,SAAwB,GAAG,IAA/B;;EACA,IAAID,MAAJ,EAAY;IACRC,SAAS,GAAGD,MAAM,CAACZ,UAAP,CAAkB;MAAE/C,KAAF;MAASc,KAAT;MAAgBH;IAAhB,CAAlB,CAAZ;EACH;;EACD,IAAI,CAACiD,SAAL,EAAgB;IACZA,SAAS,GAAG5D,KAAK,CAACD,SAAlB;;IACA,IAAIJ,UAAU,CAACc,IAAf,EAAqB;MACjBmD,SAAS,GACL,OAAOjE,UAAU,CAACc,IAAlB,KAA2B,UAA3B,GAAwCd,UAAU,CAACc,IAAX,CAAgBK,KAAhB,CAAxC,GAAiEnB,UAAU,CAACc,IADhF;IAEH;EACJ;;EAED,MAAMoD,YAAY,GAAG1D,OAAO,GAAG,UAAH,GAAgB,EAA5C;;EACA,IAAI,CAACjB,UAAL,EAAiB;IACb,OAAQ,GAAE0E,SAAU,GAAEC,YAAa,EAAnC;EACH;;EACD,OAAQ,GAAE3E,UAAW,IAAG0E,SAAU,GAAEC,YAAa,EAAjD;AACH,CAtBD;;AAkCA,MAAMC,cAAc,GAAInC,MAAD,IAAkC;EACrD,MAAM;IACFG,KADE;IAEFnC,UAFE;IAGFoE,QAHE;IAIFpD,GAJE;IAKFG,KAAK,EAAEkD,YALL;IAMFC,eANE;IAOF9E,aAPE;IAQFD;EARE,IASFyC,MATJ;EAUA,MAAMgC,MAAM,GAAGM,eAAe,CAACF,QAAD,CAA9B;;EACA,IAAI,CAACJ,MAAL,EAAa;IACT,MAAM,IAAIb,cAAJ,CAAgB,0BAAhB,EAA4C,gBAA5C,EAA8D;MAChEiB;IADgE,CAA9D,CAAN;EAGH;;EACD,MAAMG,iBAAiB,GAAG/E,aAAa,CAACQ,UAAU,CAACE,IAAZ,CAAvC;EACA,MAAMiB,KAAK,GAAG,IAAAqD,gDAAA,EAAwB;IAClCzE,OAAO,EAAEP,aADyB;IAElCa,KAAK,EAAEL,UAAU,CAACK,KAFgB;IAGlCc,KAAK,EAAEkD;EAH2B,CAAxB,CAAd;EAMA,MAAM7D,OAAO,GAAGC,UAAU,CAACT,UAAD,CAA1B;EACAgE,MAAM,CAACS,KAAP,CAAatC,KAAb,EAAoB;IAChBuC,QAAQ,EAAEX,gBAAgB,CAAC;MACvBC,MAAM,EAAEO,iBADe;MAEvBvE,UAFuB;MAGvBT,UAAU,EAAES,UAAU,CAACsD,aAAX,GAA2B,IAA3B,GAAkC/D,UAHvB;MAIvB4B,KAJuB;MAKvBH;IALuB,CAAD,CADV;IAQhBF,IAAI,EAAEiD,gBAAgB,CAAC;MACnBC,MAAM,EAAEO,iBADW;MAEnBvE,UAFmB;MAGnBmB,KAHmB;MAInB5B,UAAU,EAAES,UAAU,CAACsD,aAAX,GAA2B,IAA3B,GAAkC/D,UAJ3B;MAKnBiB,OALmB;MAMnBQ;IANmB,CAAD,CARN;IAgBhBG,KAhBgB;IAiBhBX;EAjBgB,CAApB;AAmBH,CA5CD;;AAoDA,MAAMmE,mBAAmB,GAAI3C,MAAD,IAA6C;EACrE,MAAM;IAAEG,KAAF;IAAS7C,WAAT;IAAsBsD,IAAtB;IAA4Bf;EAA5B,IAAuCG,MAA7C;;EACA,IAAI,CAACY,IAAD,IAASA,IAAI,CAACnD,MAAL,KAAgB,CAAzB,IAA8BoC,MAAM,CAACpC,MAAP,KAAkB,CAApD,EAAuD;IACnD;EACH;;EAED,MAAMmF,UAAU,GAAG/C,MAAM,CAAC/B,MAAP,CAAc,CAAC+E,UAAD,EAAaxE,KAAb,KAAuB;IACpD,MAAML,UAAU,GAAGV,WAAW,CAACe,KAAK,CAACF,OAAP,CAA9B;;IACA,IAAI,CAACH,UAAL,EAAiB;MACb,OAAO6E,UAAP;IACH;;IAEDA,UAAU,CAAClC,IAAX,CAAiB,UAAStC,KAAK,CAACD,SAAU,EAA1C;IAEA,OAAOyE,UAAP;EACH,CATkB,EAShB,EATgB,CAAnB;EAWA1C,KAAK,CAACC,IAAN,CAAWO,IAAX,CAAgB;IACZmC,YAAY,EAAE;MACVC,sBAAsB,EAAE,IADd;MAEVlD,MAAM,EAAE+C,UAFE;MAGVzC,KAAK,EAAE,IAAA6C,gCAAA,EAAepC,IAAf,CAHG;MAIVqC,gBAAgB,EAAE;IAJR;EADF,CAAhB;AAQH,CAzBD;AA2BA;AACA;AACA;;;AACA,MAAMC,kCAAkC,GACpClD,MADuC,IAER;EAC/B,MAAM;IACFJ,KADE;IAEFK,KAAK,EAAEC,YAFL;IAGF5C,WAHE;IAIFC,UAJE;IAKFQ,OALE;IAMFP,aANE;IAOF2F;EAPE,IAQFnD,MARJ;EAUA,MAAMC,KAAiC,mCAChCC,YADgC,CAAvC;EAGA,MAAMC,KAAK,GAAGJ,uBAAuB,6DAC9BC,MAD8B;IAEjCC;EAFiC,GAArC;EAKA;AACJ;AACA;;EACI0C,mBAAmB,CAAC;IAChBxC,KADgB;IAEhB7C,WAFgB;IAGhBsD,IAAI,EAAEuC,cAAc,CAACvC,IAHL;IAIhBf,MAAM,EAAEsD,cAAc,CAACtD;EAJP,CAAD,CAAnB;EAOA;AACJ;AACA;;EACI,KAAK,MAAMuD,EAAX,IAAiBnG,aAAjB,EAAgC;IAC5B,OAAOgD,KAAK,CAACmD,EAAD,CAAZ;EACH;;EAED,IAAIxF,MAAM,CAACyF,IAAP,CAAYpD,KAAZ,EAAmBxC,MAAnB,KAA8B,CAAlC,EAAqC;IACjC,OAAO0C,KAAP;EACH;;EAED,MAAMmC,eAAe,GAAG,IAAAgB,yDAAA,EAAwCvF,OAAxC,EAAiD6B,KAAK,CAACkB,MAAvD,CAAxB;;EAEA,KAAK,MAAM9B,GAAX,IAAkBiB,KAAlB,EAAyB;IACrB,IAAIA,KAAK,CAACsD,cAAN,CAAqBvE,GAArB,MAA8B,KAAlC,EAAyC;MACrC;IACH;IACD;AACR;AACA;AACA;IACQ;;;IACA,MAAMG,KAAK,GAAIc,KAAD,CAAejB,GAAf,CAAd;;IACA,IAAIG,KAAK,KAAKqE,SAAd,EAAyB;MACrB;IACH;;IACD,MAAM;MAAEnF,KAAF;MAAS+D;IAAT,IAAsB,IAAAqB,+BAAA,EAAczE,GAAd,CAA5B;IACA;AACR;AACA;AACA;AACA;AACA;;IAEQ,IAAIb,OAAO,GAAGE,KAAd;IACA,MAAMqF,aAAa,GAAG/D,kBAAkB,CAACC,KAAD,EAAQzB,OAAR,CAAxC;;IACA,IAAI,CAACuF,aAAD,IAAkB,CAACpG,WAAW,CAACa,OAAD,CAAlC,EAA6C;MACzC,MAAM,IAAIgD,cAAJ,CAAiB,sCAAqChD,OAAQ,IAA9D,CAAN;IACH,CAFD,MAEO,IAAIuF,aAAJ,EAAmB;MACtBvF,OAAO,GAAGuF,aAAa,CAACvF,OAAxB;IACH;;IAED,MAAMH,UAAU,GAAGV,WAAW,CAACa,OAAD,CAA9B;;IAEA,IAAI,CAACH,UAAL,EAAiB;MACb,MAAM,IAAImD,cAAJ,CAAiB,sBAAqBhD,OAAQ,IAA9C,CAAN;IACH;;IACD,MAAM;MAAEU,YAAY,GAAG,KAAjB;MAAwBR,KAAK,EAAEsF;IAA/B,IAA4C3F,UAAlD;;IACA,IAAI,CAACa,YAAL,EAAmB;MACf,MAAM,IAAIsC,cAAJ,CAAiB,UAAShD,OAAQ,sBAAlC,CAAN;IACH;IACD;AACR;AACA;AACA;;;IACQ,IAAIsD,mBAAmB,CAAC;MAAEzC,GAAF;MAAOG,KAAP;MAAcd,KAAK,EAAEsF;IAArB,CAAD,CAAvB,EAA0D;MACtD;AACZ;AACA;MACY,KAAK,MAAMC,QAAX,IAAuBzE,KAAvB,EAA8B;QAC1B,MAAM;UAAEiD;QAAF,IAAe,IAAAqB,+BAAA,EAAcG,QAAd,CAArB;QACAzB,cAAc,CAAC;UACXhC,KADW;UAEXnC,UAFW;UAGXoE,QAHW;UAIXpD,GAAG,EAAE4E,QAJM;UAKXzE,KAAK,EAAEA,KAAK,CAACyE,QAAD,CALD;UAMXpG,aANW;UAOX8E,eAPW;UAQX/E;QARW,CAAD,CAAd;MAUH;;MACD;IACH;;IACD4E,cAAc,CAAC;MACXhC,KADW;MAEXnC,UAFW;MAGXoE,QAHW;MAIXpD,GAJW;MAKXG,KALW;MAMX3B,aANW;MAOX8E,eAPW;MAQX/E;IARW,CAAD,CAAd;EAUH;;EAED,OAAO4C,KAAP;AACH,CAtHD;;AAwHO,MAAM0D,4BAA4B,GAAI7D,MAAD,IAAqD;EAC7F,MAAM;IAAEjC,OAAF;IAAW6B,KAAX;IAAkBxC,IAAlB;IAAwBG,UAAU,GAAG;EAArC,IAA8CyC,MAApD;EACA,MAAM;IAAEC,KAAK,GAAG,EAAV;IAAc6D,KAAd;IAAqBC,KAArB;IAA4B1G,IAAI,EAAE2G,WAAlC;IAA+CC,MAA/C;IAAuDpE,MAAM,GAAG;EAAhE,IAAuEzC,IAA7E;EAEA,MAAME,WAAW,GAAG,IAAA4G,yBAAA,EAAkBnG,OAAlB,EAA2B6B,KAA3B,CAApB;EACA,MAAMpC,aAAa,GAAG,IAAA2G,oCAAA,EAAkBpG,OAAlB,CAAtB;EAEA,MAAMqG,oBAAqC,GAAG,EAA9C;EACA;AACJ;AACA;;EACI,IAAI,CAAC,CAACH,MAAN,EAAc;IACV,KAAK,MAAM9F,OAAX,IAAsB0B,MAAtB,EAA8B;MAC1B,MAAMxB,KAAK,GAAGuB,KAAK,CAACC,MAAN,CAAaC,IAAb,CAAkBuE,CAAC,IAAIA,CAAC,CAAClG,OAAF,KAAcA,OAArC,CAAd;;MACA,IAAI,CAACE,KAAL,EAAY;QACR;MACH;;MACD+F,oBAAoB,CAACzD,IAArB,CAA0BtC,KAA1B;IACH;EACJ;;EAED,MAAM8B,KAAK,GAAG+C,kCAAkC,CAAC;IAC7CtD,KAD6C;IAE7C7B,OAF6C;IAG7CkC,KAH6C;IAI7C3C,WAJ6C;IAK7CC,UAL6C;IAM7CC,aAN6C;IAO7C2F,cAAc,EAAE;MACZvC,IAAI,EAAEqD,MADM;MAEZpE,MAAM,EAAEuE;IAFI;EAP6B,CAAD,CAAhD;EAaA,MAAME,YAAY,GAAGvG,OAAO,CACvBwG,MADgB,CAEbC,kFAAA,CAAyCtG,IAF5B,EAIhBqB,MAJgB,CAITkF,EAAE,IAAI;IACV,OAAO,CAACA,EAAE,CAACC,OAAJ,IAAeD,EAAE,CAACC,OAAH,KAAe9E,KAAK,CAAC8E,OAA3C;EACH,CANgB,CAArB;;EAOA,KAAK,MAAMD,EAAX,IAAiBH,YAAjB,EAA+B;IAC3BG,EAAE,CAACE,WAAH,CAAe;MAAExE,KAAF;MAASP,KAAT;MAAgBK;IAAhB,CAAf;EACH;;EAED,MAAM5C,IAAI,GAAGF,6BAA6B,CAAC;IACvCY,OADuC;IAEvCV,IAAI,EAAE2G,WAFiC;IAGvC1G,WAHuC;IAIvCC,UAJuC;IAKvCqC,KALuC;IAMvCpC;EANuC,CAAD,CAA1C;EASA,MAAMG,WAAW,GAAGI,OAAO,CACtBwG,MADe,CAEZK,gFAAA,CAAwC1G,IAF5B,EAIfqB,MAJe,CAIRkF,EAAE,IAAI;IACV,OAAO,CAACA,EAAE,CAACC,OAAJ,IAAeD,EAAE,CAACC,OAAH,KAAe9E,KAAK,CAAC8E,OAA3C;EACH,CANe,CAApB;;EAOA,KAAK,MAAMD,EAAX,IAAiB9G,WAAjB,EAA8B;IAC1B8G,EAAE,CAACI,UAAH,CAAc;MACVxH,IADU;MAEVuC;IAFU,CAAd;EAIH;;EAED,MAAMkF,IAAkB,GAAG;IACvB3E,KAAK,EAAE;MACH4E,IAAI,EAAE;QACF3E,IAAI,EAAED,KAAK,CAACC,IAAN,CAAW3C,MAAX,GAAoB,CAApB,GAAwB0C,KAAK,CAACC,IAA9B,GAAqCoD,SADzC;QAEFnD,QAAQ,EAAEF,KAAK,CAACE,QAAN,CAAe5C,MAAf,GAAwB,CAAxB,GAA4B0C,KAAK,CAACE,QAAlC,GAA6CmD,SAFrD;QAGFlD,MAAM,EAAEH,KAAK,CAACG,MAAN,CAAa7C,MAAb,GAAsB,CAAtB,GAA0B0C,KAAK,CAACG,MAAhC,GAAyCkD,SAH/C;QAIFjE,MAAM,EAAEY,KAAK,CAACZ,MAAN,CAAa9B,MAAb,GAAsB,CAAtB,GAA0B0C,KAAK,CAACZ,MAAhC,GAAyCiE;MAJ/C;IADH,CADgB;IASvBnG,IATuB;IAUvB2H,IAAI,EAAE,CAACjB,KAAK,IAAI,CAAV,IAAe,CAVE;IAWvB;IACAkB,YAAY,EAAE,IAAAC,8BAAA,EAAapB,KAAb,CAZS;IAavB;IACAqB,gBAAgB,EAAE;EAdK,CAA3B;EAiBA,MAAMC,WAAW,GAAGrH,OAAO,CACtBwG,MADe,CAEZc,gFAAA,CAAwCnH,IAF5B,EAIfqB,MAJe,CAIRkF,EAAE,IAAI;IACV,OAAO,CAACA,EAAE,CAACC,OAAJ,IAAeD,EAAE,CAACC,OAAH,KAAe9E,KAAK,CAAC8E,OAA3C;EACH,CANe,CAApB;;EAOA,KAAK,MAAMD,EAAX,IAAiBW,WAAjB,EAA8B;IAC1BX,EAAE,CAACa,UAAH,CAAc;MACVR,IADU;MAEVlF,KAFU;MAGVK;IAHU,CAAd;EAKH;;EAED,OAAO6E,IAAP;AACH,CArGM"}
|