@webiny/api-headless-cms-ddb-es 5.33.5 → 5.34.0-beta.1

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.
Files changed (150) hide show
  1. package/configurations.js +1 -1
  2. package/definitions/entry.js +3 -7
  3. package/definitions/entry.js.map +1 -1
  4. package/definitions/entryElasticsearch.js +3 -7
  5. package/definitions/entryElasticsearch.js.map +1 -1
  6. package/definitions/group.js +3 -7
  7. package/definitions/group.js.map +1 -1
  8. package/definitions/model.js +8 -7
  9. package/definitions/model.js.map +1 -1
  10. package/definitions/settings.js +3 -7
  11. package/definitions/settings.js.map +1 -1
  12. package/definitions/system.js +3 -7
  13. package/definitions/system.js.map +1 -1
  14. package/dynamoDb/index.d.ts +1 -1
  15. package/dynamoDb/storage/date.d.ts +2 -1
  16. package/dynamoDb/storage/date.js +1 -1
  17. package/dynamoDb/storage/date.js.map +1 -1
  18. package/dynamoDb/storage/longText.d.ts +1 -1
  19. package/dynamoDb/storage/longText.js +8 -1
  20. package/dynamoDb/storage/longText.js.map +1 -1
  21. package/dynamoDb/storage/richText.d.ts +1 -1
  22. package/dynamoDb/storage/richText.js +1 -1
  23. package/elasticsearch/createElasticsearchIndex.js +1 -1
  24. package/elasticsearch/index.js +1 -1
  25. package/elasticsearch/indexing/index.js +1 -1
  26. package/elasticsearch/indexing/longTextIndexing.d.ts +4 -0
  27. package/elasticsearch/indexing/longTextIndexing.js +20 -4
  28. package/elasticsearch/indexing/longTextIndexing.js.map +1 -1
  29. package/elasticsearch/search/refSearch.js +4 -2
  30. package/elasticsearch/search/refSearch.js.map +1 -1
  31. package/helpers/entryIndexHelpers.js +6 -11
  32. package/helpers/entryIndexHelpers.js.map +1 -1
  33. package/helpers/index.d.ts +0 -1
  34. package/helpers/index.js +0 -13
  35. package/helpers/index.js.map +1 -1
  36. package/index.js +17 -10
  37. package/index.js.map +1 -1
  38. package/operations/entry/dataLoaders.js +7 -9
  39. package/operations/entry/dataLoaders.js.map +1 -1
  40. package/operations/entry/elasticsearch/assignMinimumShouldMatchToQuery.d.ts +18 -0
  41. package/operations/entry/elasticsearch/assignMinimumShouldMatchToQuery.js +34 -0
  42. package/operations/entry/elasticsearch/assignMinimumShouldMatchToQuery.js.map +1 -0
  43. package/operations/entry/elasticsearch/body.d.ts +13 -0
  44. package/operations/entry/elasticsearch/body.js +162 -0
  45. package/operations/entry/elasticsearch/body.js.map +1 -0
  46. package/operations/entry/elasticsearch/fields.d.ts +9 -0
  47. package/operations/entry/elasticsearch/fields.js +248 -0
  48. package/operations/entry/elasticsearch/fields.js.map +1 -0
  49. package/operations/entry/elasticsearch/filtering/applyFiltering.d.ts +8 -0
  50. package/operations/entry/elasticsearch/filtering/applyFiltering.js +66 -0
  51. package/operations/entry/elasticsearch/filtering/applyFiltering.js.map +1 -0
  52. package/operations/entry/elasticsearch/filtering/exec.d.ts +17 -0
  53. package/operations/entry/elasticsearch/filtering/exec.js +215 -0
  54. package/operations/entry/elasticsearch/filtering/exec.js.map +1 -0
  55. package/operations/entry/elasticsearch/filtering/index.d.ts +1 -0
  56. package/operations/entry/elasticsearch/filtering/index.js +18 -0
  57. package/operations/entry/elasticsearch/filtering/index.js.map +1 -0
  58. package/operations/entry/elasticsearch/filtering/path.d.ts +15 -0
  59. package/operations/entry/elasticsearch/filtering/path.js +52 -0
  60. package/operations/entry/elasticsearch/filtering/path.js.map +1 -0
  61. package/operations/entry/elasticsearch/filtering/plugins/defaultFilterPlugin.d.ts +2 -0
  62. package/operations/entry/elasticsearch/filtering/plugins/defaultFilterPlugin.js +35 -0
  63. package/operations/entry/elasticsearch/filtering/plugins/defaultFilterPlugin.js.map +1 -0
  64. package/operations/entry/elasticsearch/filtering/plugins/index.d.ts +1 -0
  65. package/operations/entry/elasticsearch/filtering/plugins/index.js +18 -0
  66. package/operations/entry/elasticsearch/filtering/plugins/index.js.map +1 -0
  67. package/operations/entry/elasticsearch/filtering/plugins/objectFilterPlugin.d.ts +2 -0
  68. package/operations/entry/elasticsearch/filtering/plugins/objectFilterPlugin.js +78 -0
  69. package/operations/entry/elasticsearch/filtering/plugins/objectFilterPlugin.js.map +1 -0
  70. package/operations/entry/elasticsearch/filtering/plugins/refFilterPlugin.d.ts +2 -0
  71. package/operations/entry/elasticsearch/filtering/plugins/refFilterPlugin.js +58 -0
  72. package/operations/entry/elasticsearch/filtering/plugins/refFilterPlugin.js.map +1 -0
  73. package/operations/entry/elasticsearch/filtering/populated.d.ts +2 -0
  74. package/operations/entry/elasticsearch/filtering/populated.js +30 -0
  75. package/operations/entry/elasticsearch/filtering/populated.js.map +1 -0
  76. package/operations/entry/elasticsearch/filtering/values.d.ts +2 -0
  77. package/operations/entry/elasticsearch/filtering/values.js +28 -0
  78. package/operations/entry/elasticsearch/filtering/values.js.map +1 -0
  79. package/operations/entry/elasticsearch/fullTextSearch.d.ts +9 -0
  80. package/operations/entry/elasticsearch/fullTextSearch.js +34 -0
  81. package/operations/entry/elasticsearch/fullTextSearch.js.map +1 -0
  82. package/operations/entry/elasticsearch/fullTextSearchFields.d.ts +8 -0
  83. package/operations/entry/elasticsearch/fullTextSearchFields.js +52 -0
  84. package/operations/entry/elasticsearch/fullTextSearchFields.js.map +1 -0
  85. package/operations/entry/elasticsearch/initialQuery.d.ts +17 -0
  86. package/operations/entry/elasticsearch/initialQuery.js +117 -0
  87. package/operations/entry/elasticsearch/initialQuery.js.map +1 -0
  88. package/operations/entry/elasticsearch/keyword.d.ts +2 -0
  89. package/operations/entry/elasticsearch/keyword.js +38 -0
  90. package/operations/entry/elasticsearch/keyword.js.map +1 -0
  91. package/operations/entry/elasticsearch/plugins/bodyModifier.d.ts +9 -0
  92. package/operations/entry/elasticsearch/plugins/bodyModifier.js +19 -0
  93. package/operations/entry/elasticsearch/plugins/bodyModifier.js.map +1 -0
  94. package/operations/entry/elasticsearch/plugins/operator.d.ts +8 -0
  95. package/operations/entry/elasticsearch/plugins/operator.js +45 -0
  96. package/operations/entry/elasticsearch/plugins/operator.js.map +1 -0
  97. package/operations/entry/elasticsearch/plugins/queryModifier.d.ts +9 -0
  98. package/operations/entry/elasticsearch/plugins/queryModifier.js +19 -0
  99. package/operations/entry/elasticsearch/plugins/queryModifier.js.map +1 -0
  100. package/operations/entry/elasticsearch/plugins/search.d.ts +7 -0
  101. package/{helpers/searchPluginsList.js → operations/entry/elasticsearch/plugins/search.js} +9 -5
  102. package/operations/entry/elasticsearch/plugins/search.js.map +1 -0
  103. package/operations/entry/elasticsearch/plugins/sortModifier.d.ts +9 -0
  104. package/operations/entry/elasticsearch/plugins/sortModifier.js +19 -0
  105. package/operations/entry/elasticsearch/plugins/sortModifier.js.map +1 -0
  106. package/operations/entry/elasticsearch/sort.d.ts +12 -0
  107. package/operations/entry/elasticsearch/sort.js +92 -0
  108. package/operations/entry/elasticsearch/sort.js.map +1 -0
  109. package/operations/entry/elasticsearch/transformValueForSearch.d.ts +16 -0
  110. package/{helpers → operations/entry/elasticsearch}/transformValueForSearch.js +8 -3
  111. package/operations/entry/elasticsearch/transformValueForSearch.js.map +1 -0
  112. package/operations/entry/elasticsearch/types.d.ts +41 -0
  113. package/operations/entry/elasticsearch/types.js +5 -0
  114. package/operations/entry/elasticsearch/types.js.map +1 -0
  115. package/operations/entry/elasticsearchFields.js +3 -0
  116. package/operations/entry/elasticsearchFields.js.map +1 -1
  117. package/operations/entry/index.d.ts +0 -2
  118. package/operations/entry/index.js +100 -310
  119. package/operations/entry/index.js.map +1 -1
  120. package/operations/entry/recordType.d.ts +3 -0
  121. package/operations/entry/recordType.js +24 -0
  122. package/operations/entry/recordType.js.map +1 -0
  123. package/operations/group/index.js +7 -12
  124. package/operations/group/index.js.map +1 -1
  125. package/operations/model/index.js +4 -8
  126. package/operations/model/index.js.map +1 -1
  127. package/operations/settings/index.js +6 -10
  128. package/operations/settings/index.js.map +1 -1
  129. package/operations/system/index.js +4 -8
  130. package/operations/system/index.js.map +1 -1
  131. package/package.json +18 -19
  132. package/plugins/CmsEntryElasticsearchBodyModifierPlugin.js +1 -1
  133. package/plugins/CmsEntryElasticsearchFieldPlugin.js +1 -1
  134. package/plugins/CmsEntryElasticsearchIndexPlugin.js +1 -1
  135. package/plugins/CmsEntryElasticsearchQueryBuilderValueSearchPlugin.js +1 -1
  136. package/plugins/CmsEntryElasticsearchQueryModifierPlugin.js +1 -1
  137. package/plugins/CmsEntryElasticsearchSortModifierPlugin.js +1 -1
  138. package/plugins/CmsEntryFilterPlugin.d.ts +49 -0
  139. package/plugins/CmsEntryFilterPlugin.js +31 -0
  140. package/plugins/CmsEntryFilterPlugin.js.map +1 -0
  141. package/helpers/createElasticsearchQueryBody.d.ts +0 -11
  142. package/helpers/createElasticsearchQueryBody.js +0 -618
  143. package/helpers/createElasticsearchQueryBody.js.map +0 -1
  144. package/helpers/fields.d.ts +0 -19
  145. package/helpers/fields.js +0 -196
  146. package/helpers/fields.js.map +0 -1
  147. package/helpers/searchPluginsList.d.ts +0 -6
  148. package/helpers/searchPluginsList.js.map +0 -1
  149. package/helpers/transformValueForSearch.d.ts +0 -12
  150. package/helpers/transformValueForSearch.js.map +0 -1
@@ -1,618 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
- Object.defineProperty(exports, "__esModule", {
6
- value: true
7
- });
8
- exports.createElasticsearchQueryBody = void 0;
9
-
10
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
11
-
12
- var _error = _interopRequireDefault(require("@webiny/error"));
13
-
14
- var _transformValueForSearch = require("./transformValueForSearch");
15
-
16
- var _searchPluginsList = require("./searchPluginsList");
17
-
18
- var _apiElasticsearch = require("@webiny/api-elasticsearch");
19
-
20
- var _fields = require("./fields");
21
-
22
- var _CmsEntryElasticsearchFieldPlugin = require("../plugins/CmsEntryElasticsearchFieldPlugin");
23
-
24
- var _entry = require("../operations/entry");
25
-
26
- var _CmsEntryElasticsearchQueryModifierPlugin = require("../plugins/CmsEntryElasticsearchQueryModifierPlugin");
27
-
28
- var _CmsEntryElasticsearchSortModifierPlugin = require("../plugins/CmsEntryElasticsearchSortModifierPlugin");
29
-
30
- var _CmsEntryElasticsearchBodyModifierPlugin = require("../plugins/CmsEntryElasticsearchBodyModifierPlugin");
31
-
32
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
33
-
34
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
35
-
36
- const specialFields = ["published", "latest"];
37
- const noKeywordFields = ["date", "datetime", "number", "boolean"];
38
-
39
- const createElasticsearchSortParams = args => {
40
- const {
41
- sort,
42
- modelFields,
43
- parentPath,
44
- searchPlugins
45
- } = args;
46
-
47
- if (!sort || sort.length === 0) {
48
- return [];
49
- }
50
-
51
- const fieldIdToStorageIdIdMap = {};
52
- const sortPlugins = Object.values(modelFields).reduce((plugins, modelField) => {
53
- const searchPlugin = searchPlugins[modelField.type];
54
- const {
55
- fieldId,
56
- storageId
57
- } = modelField.field;
58
- fieldIdToStorageIdIdMap[fieldId] = fieldId;
59
- /**
60
- * Plugins must be stored with fieldId as key because it is later used to find the sorting plugin.
61
- */
62
-
63
- plugins[fieldId] = new _CmsEntryElasticsearchFieldPlugin.CmsEntryElasticsearchFieldPlugin({
64
- unmappedType: modelField.unmappedType,
65
- keyword: hasKeyword(modelField),
66
- sortable: modelField.isSortable,
67
- searchable: modelField.isSearchable,
68
- field: fieldId,
69
- path: createFieldPath({
70
- key: storageId,
71
- parentPath,
72
- modelField,
73
- searchPlugin
74
- })
75
- });
76
- return plugins;
77
- }, {});
78
- const transformedSort = sort.map(value => {
79
- const matched = value.match(/^([a-zA-Z-0-9_]+)_(ASC|DESC)$/);
80
-
81
- if (!matched) {
82
- return null;
83
- }
84
-
85
- const [, fieldId, order] = matched;
86
-
87
- if (fieldIdToStorageIdIdMap[fieldId]) {
88
- return `${fieldIdToStorageIdIdMap[fieldId]}_${order}`;
89
- }
90
-
91
- return value;
92
- }).filter(Boolean);
93
- return (0, _apiElasticsearch.createSort)({
94
- fieldPlugins: sortPlugins,
95
- sort: transformedSort
96
- });
97
- };
98
-
99
- const findFieldByFieldId = (model, fieldId) => {
100
- return model.fields.find(field => {
101
- return field.fieldId === fieldId;
102
- });
103
- };
104
- /**
105
- * Latest and published are specific in Elasticsearch to that extend that they are tagged in the __type property.
106
- * We allow either published or either latest.
107
- * Latest is used in the manage API and published in the read API.
108
- */
109
-
110
-
111
- const createInitialQueryValue = params => {
112
- const {
113
- model,
114
- where: initialWhere
115
- } = params;
116
- /**
117
- * Cast as partial so we can remove unnecessary keys.
118
- */
119
-
120
- const where = _objectSpread({}, initialWhere);
121
-
122
- const query = {
123
- must: [],
124
- must_not: [],
125
- should: [],
126
- filter: []
127
- }; // When ES index is shared between tenants, we need to filter records by tenant ID
128
-
129
- const sharedIndex = process.env.ELASTICSEARCH_SHARED_INDEXES === "true";
130
-
131
- if (sharedIndex) {
132
- query.must.push({
133
- term: {
134
- "tenant.keyword": model.tenant
135
- }
136
- });
137
- }
138
-
139
- query.must.push({
140
- term: {
141
- "locale.keyword": model.locale
142
- }
143
- });
144
- /**
145
- * We must transform published and latest where args into something that is understandable by our Elasticsearch
146
- */
147
-
148
- if (where.published === true) {
149
- query.must.push({
150
- term: {
151
- "__type.keyword": (0, _entry.createPublishedType)()
152
- }
153
- });
154
- } else if (where.latest === true) {
155
- query.must.push({
156
- term: {
157
- "__type.keyword": (0, _entry.createLatestType)()
158
- }
159
- });
160
- } // we do not allow not published and not latest
161
- else {
162
- throw new _error.default(`Cannot call Elasticsearch query when not setting "published" or "latest".`, "ELASTICSEARCH_UNSUPPORTED_QUERY", {
163
- where
164
- });
165
- } //
166
-
167
-
168
- return query;
169
- };
170
-
171
- const createFieldPath = ({
172
- modelField,
173
- searchPlugin,
174
- parentPath,
175
- key
176
- }) => {
177
- let path = null;
178
-
179
- if (searchPlugin && typeof searchPlugin.createPath === "function") {
180
- path = searchPlugin.createPath({
181
- field: modelField.field,
182
- value: null,
183
- key
184
- });
185
- } else if (typeof modelField.path === "function") {
186
- path = modelField.path(modelField.field.storageId);
187
- }
188
-
189
- if (!path) {
190
- /**
191
- * We know that modelFieldPath is a string or undefined at this point.
192
- */
193
- path = modelField.path || modelField.field.storageId || modelField.field.id;
194
- }
195
-
196
- return modelField.isSystemField || !parentPath || path.match(parentPath) ? path : `${parentPath}.${path}`;
197
- };
198
-
199
- const hasKeyword = modelField => {
200
- /**
201
- * We defined some field types that MUST have no keyword added to the field path
202
- */
203
- if (noKeywordFields.includes(modelField.type)) {
204
- return false;
205
- } else if (modelField.unmappedType) {
206
- /**
207
- * If modelField has unmapped type defined, do not add keyword.
208
- */
209
- return false;
210
- } else if (modelField.keyword === false) {
211
- /**
212
- * And if specifically defined that modelField has no keyword, do not add it.
213
- */
214
- return false;
215
- }
216
- /**
217
- * All other fields have keyword added.
218
- */
219
-
220
-
221
- return true;
222
- };
223
-
224
- /**
225
- * A list of typeof strings that are 100% not ref field filtering.
226
- * We also need to check for array and date.
227
- */
228
- const nonRefFieldTypes = ["string", "number", "undefined", "symbol", "bigint", "function", "boolean"];
229
-
230
- const isRefFieldFiltering = params => {
231
- const {
232
- key,
233
- value,
234
- field
235
- } = params;
236
- const typeOf = typeof value;
237
-
238
- if (!value || nonRefFieldTypes.includes(typeOf) || Array.isArray(value) || value instanceof Date || !!value.toISOString) {
239
- return false;
240
- } else if (typeOf === "object" && field.type === "ref") {
241
- return true;
242
- }
243
-
244
- throw new _error.default("Could not determine if the search value is ref field search.", "REF_FIELD_SEARCH_ERROR", {
245
- value,
246
- field,
247
- key
248
- });
249
- };
250
-
251
- const fieldPathFactory = params => {
252
- const {
253
- plugin,
254
- modelField,
255
- value,
256
- parentPath,
257
- keyword,
258
- key
259
- } = params;
260
- const field = modelField.field;
261
- let fieldPath = null;
262
-
263
- if (plugin) {
264
- fieldPath = plugin.createPath({
265
- field,
266
- value,
267
- key
268
- });
269
- }
270
-
271
- if (!fieldPath) {
272
- fieldPath = field.storageId;
273
-
274
- if (modelField.path) {
275
- fieldPath = typeof modelField.path === "function" ? modelField.path(value) : modelField.path;
276
- }
277
- }
278
-
279
- const keywordValue = keyword ? ".keyword" : "";
280
-
281
- if (!parentPath) {
282
- return `${fieldPath}${keywordValue}`;
283
- }
284
-
285
- return `${parentPath}.${fieldPath}${keywordValue}`;
286
- };
287
-
288
- const applyFiltering = params => {
289
- const {
290
- query,
291
- modelField,
292
- operator,
293
- key,
294
- value: initialValue,
295
- operatorPlugins,
296
- searchPlugins,
297
- parentPath
298
- } = params;
299
- const plugin = operatorPlugins[operator];
300
-
301
- if (!plugin) {
302
- throw new _error.default("Operator plugin missing.", "PLUGIN_MISSING", {
303
- operator
304
- });
305
- }
306
-
307
- const fieldSearchPlugin = searchPlugins[modelField.type];
308
- const value = (0, _transformValueForSearch.transformValueForSearch)({
309
- plugins: searchPlugins,
310
- field: modelField.field,
311
- value: initialValue
312
- });
313
- const keyword = hasKeyword(modelField);
314
- plugin.apply(query, {
315
- basePath: fieldPathFactory({
316
- plugin: fieldSearchPlugin,
317
- modelField,
318
- parentPath: modelField.isSystemField ? null : parentPath,
319
- value,
320
- key
321
- }),
322
- path: fieldPathFactory({
323
- plugin: fieldSearchPlugin,
324
- modelField,
325
- value,
326
- parentPath: modelField.isSystemField ? null : parentPath,
327
- keyword,
328
- key
329
- }),
330
- value,
331
- keyword
332
- });
333
- };
334
-
335
- const applyFullTextSearch = params => {
336
- const {
337
- query,
338
- modelFields,
339
- term,
340
- fields
341
- } = params;
342
-
343
- if (!term || term.length === 0 || fields.length === 0) {
344
- return;
345
- }
346
-
347
- const fieldPaths = fields.reduce((collection, field) => {
348
- const modelField = modelFields[field.fieldId];
349
-
350
- if (!modelField) {
351
- return collection;
352
- }
353
-
354
- collection.push(`values.${field.storageId}`);
355
- return collection;
356
- }, []);
357
- query.must.push({
358
- query_string: {
359
- allow_leading_wildcard: true,
360
- fields: fieldPaths,
361
- query: (0, _apiElasticsearch.normalizeValue)(term),
362
- default_operator: "or"
363
- }
364
- });
365
- };
366
- /*
367
- * Iterate through where keys and apply plugins where necessary
368
- */
369
-
370
-
371
- const execElasticsearchBuildQueryPlugins = params => {
372
- const {
373
- model,
374
- where: initialWhere,
375
- modelFields,
376
- parentPath,
377
- plugins,
378
- searchPlugins,
379
- fullTextSearch
380
- } = params;
381
-
382
- const where = _objectSpread({}, initialWhere);
383
-
384
- const query = createInitialQueryValue(_objectSpread(_objectSpread({}, params), {}, {
385
- where
386
- }));
387
- /**
388
- * Add full text search for requested fields.
389
- */
390
-
391
- applyFullTextSearch({
392
- query,
393
- modelFields,
394
- term: fullTextSearch.term,
395
- fields: fullTextSearch.fields
396
- });
397
- /**
398
- * Always remove special fields, as these do not exist in Elasticsearch.
399
- */
400
-
401
- for (const sf of specialFields) {
402
- delete where[sf];
403
- }
404
-
405
- if (Object.keys(where).length === 0) {
406
- return query;
407
- }
408
-
409
- const operatorPlugins = (0, _apiElasticsearch.getElasticsearchOperatorPluginsByLocale)(plugins, model.locale);
410
-
411
- for (const key in where) {
412
- if (where.hasOwnProperty(key) === false) {
413
- continue;
414
- }
415
- /**
416
- * We do not need to go further if value is undefined.
417
- * There are few hardcoded possibilities when value is undefined, for example, ownedBy.
418
- */
419
- // TODO figure out how to have type.
420
-
421
-
422
- const value = where[key];
423
-
424
- if (value === undefined) {
425
- continue;
426
- }
427
-
428
- const {
429
- field,
430
- operator
431
- } = (0, _apiElasticsearch.parseWhereKey)(key);
432
- /**
433
- * TODO This will be required until the storage operations receive the fieldId instead of field storageId.
434
- * TODO For this to work without field searching, we need to refactor how the query looks like.
435
- *
436
- * Storage operations should NEVER receive an field storageId, only alias - fieldId.
437
- */
438
-
439
- let fieldId = field;
440
- const cmsModelField = findFieldByFieldId(model, fieldId);
441
-
442
- if (!cmsModelField && !modelFields[fieldId]) {
443
- throw new _error.default(`There is no CMS Model Field field "${fieldId}".`);
444
- } else if (cmsModelField) {
445
- fieldId = cmsModelField.fieldId;
446
- }
447
-
448
- const modelField = modelFields[fieldId];
449
-
450
- if (!modelField) {
451
- throw new _error.default(`There is no field "${fieldId}".`);
452
- }
453
-
454
- const {
455
- isSearchable = false,
456
- field: cmsField
457
- } = modelField;
458
-
459
- if (!isSearchable) {
460
- throw new _error.default(`Field "${fieldId}" is not searchable.`);
461
- }
462
- /**
463
- * There is a possibility that value is an object.
464
- * In that case, check if field is ref field and continue a bit differently.
465
- */
466
-
467
-
468
- if (isRefFieldFiltering({
469
- key,
470
- value,
471
- field: cmsField
472
- })) {
473
- /**
474
- * We we need to go through each key in where[key] to determine the filters.
475
- */
476
- for (const whereKey in value) {
477
- const {
478
- operator
479
- } = (0, _apiElasticsearch.parseWhereKey)(whereKey);
480
- applyFiltering({
481
- query,
482
- modelField,
483
- operator,
484
- key: whereKey,
485
- value: value[whereKey],
486
- searchPlugins,
487
- operatorPlugins,
488
- parentPath
489
- });
490
- }
491
-
492
- continue;
493
- }
494
-
495
- applyFiltering({
496
- query,
497
- modelField,
498
- operator,
499
- key,
500
- value,
501
- searchPlugins,
502
- operatorPlugins,
503
- parentPath
504
- });
505
- }
506
-
507
- return query;
508
- };
509
-
510
- const createElasticsearchQueryBody = params => {
511
- const {
512
- plugins,
513
- model,
514
- args,
515
- parentPath = null
516
- } = params;
517
- const {
518
- where = {},
519
- after,
520
- limit,
521
- sort: initialSort,
522
- search,
523
- fields = []
524
- } = args;
525
- const modelFields = (0, _fields.createModelFields)(plugins, model);
526
- const searchPlugins = (0, _searchPluginsList.searchPluginsList)(plugins);
527
- const fullTextSearchFields = [];
528
- /**
529
- * No point in going through fields if there is no search performed.
530
- */
531
-
532
- if (!!search) {
533
- for (const fieldId of fields) {
534
- const field = model.fields.find(f => f.fieldId === fieldId);
535
-
536
- if (!field) {
537
- continue;
538
- }
539
-
540
- fullTextSearchFields.push(field);
541
- }
542
- }
543
-
544
- const query = execElasticsearchBuildQueryPlugins({
545
- model,
546
- plugins,
547
- where,
548
- modelFields,
549
- parentPath,
550
- searchPlugins,
551
- fullTextSearch: {
552
- term: search,
553
- fields: fullTextSearchFields
554
- }
555
- });
556
- const queryPlugins = plugins.byType(_CmsEntryElasticsearchQueryModifierPlugin.CmsEntryElasticsearchQueryModifierPlugin.type).filter(pl => {
557
- return !pl.modelId || pl.modelId === model.modelId;
558
- });
559
-
560
- for (const pl of queryPlugins) {
561
- pl.modifyQuery({
562
- query,
563
- model,
564
- where
565
- });
566
- }
567
-
568
- const sort = createElasticsearchSortParams({
569
- plugins,
570
- sort: initialSort,
571
- modelFields,
572
- parentPath,
573
- model,
574
- searchPlugins
575
- });
576
- const sortPlugins = plugins.byType(_CmsEntryElasticsearchSortModifierPlugin.CmsEntryElasticsearchSortModifierPlugin.type).filter(pl => {
577
- return !pl.modelId || pl.modelId === model.modelId;
578
- });
579
-
580
- for (const pl of sortPlugins) {
581
- pl.modifySort({
582
- sort,
583
- model
584
- });
585
- }
586
-
587
- const body = {
588
- query: {
589
- bool: {
590
- must: query.must.length > 0 ? query.must : undefined,
591
- must_not: query.must_not.length > 0 ? query.must_not : undefined,
592
- should: query.should.length > 0 ? query.should : undefined,
593
- filter: query.filter.length > 0 ? query.filter : undefined
594
- }
595
- },
596
- sort,
597
- size: (limit || 0) + 1,
598
- // eslint-disable-next-line
599
- search_after: (0, _apiElasticsearch.decodeCursor)(after),
600
- // eslint-disable-next-line
601
- track_total_hits: true
602
- };
603
- const bodyPlugins = plugins.byType(_CmsEntryElasticsearchBodyModifierPlugin.CmsEntryElasticsearchBodyModifierPlugin.type).filter(pl => {
604
- return !pl.modelId || pl.modelId === model.modelId;
605
- });
606
-
607
- for (const pl of bodyPlugins) {
608
- pl.modifyBody({
609
- body,
610
- model,
611
- where
612
- });
613
- }
614
-
615
- return body;
616
- };
617
-
618
- exports.createElasticsearchQueryBody = createElasticsearchQueryBody;
@@ -1 +0,0 @@
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":"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"}