@fibery/expression-utils 1.1.10 → 1.1.12

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.
@@ -1,724 +0,0 @@
1
- var _ = require('lodash');
2
- var moment = require('moment');
3
- var trace = require('@fibery/helpers/utils/trace');
4
-
5
- function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
6
-
7
- var ___default = /*#__PURE__*/_interopDefaultLegacy(_);
8
- var moment__default = /*#__PURE__*/_interopDefaultLegacy(moment);
9
-
10
- const serializeDate = momentDate => {
11
- return momentDate.format("YYYY-MM-DD");
12
- };
13
- const serializeDateTime = momentDate => {
14
- return momentDate.toISOString();
15
- };
16
- const formulaTodayDateParamPlaceholder = "$formula-today-date-placeholder";
17
- const formulaNowDateTimeParamPlaceholder = "$formula-now-date-time-placeholder";
18
- const todayDateParamPlaceholder = "$today-date";
19
- const tomorrowDateParamPlaceholder = "$tomorrow-date";
20
- const yesterdayDateParamPlaceholder = "$yesterday-date";
21
- const weekAgoDateParamPlaceholder = "$week-ago-date";
22
- const weekFromNowDateParamPlaceholder = "$week-from-now-date";
23
- const monthAgoDateParamPlaceholder = "$month-ago-date";
24
- const monthFromNowDateParamPlaceholder = "$month-from-now-date";
25
- const yearAgoDateParamPlaceholder = "$year-ago-date";
26
- const yearFromNowDateParamPlaceholder = "$year-from-now-date";
27
- const todayStartDateTimeParamPlaceholder = "$today-date-time-start";
28
- const todayEndDateTimeParamPlaceholder = "$today-date-time-end";
29
- const tomorrowStartDateTimeParamPlaceholder = "$tomorrow-date-time-start";
30
- const tomorrowEndDateTimeParamPlaceholder = "$tomorrow-date-time-end";
31
- const yesterdayStartDateTimeParamPlaceholder = "$yesterday-date-time-start";
32
- const yesterdayEndDateTimeParamPlaceholder = "$yesterday-date-time-end";
33
- const weekAgoStartDateTimeParamPlaceholder = "$week-ago-date-time-start";
34
- const weekAgoEndDateTimeParamPlaceholder = "$week-ago-date-time-end";
35
- const weekFromNowStartDateTimeParamPlaceholder = "$week-from-now-date-time-start";
36
- const weekFromNowEndDateTimeParamPlaceholder = "$week-from-now-date-time-end";
37
- const monthAgoStartDateTimeParamPlaceholder = "$month-ago-date-time-start";
38
- const monthAgoEndDateTimeParamPlaceholder = "$month-ago-date-time-end";
39
- const monthFromNowStartDateTimeParamPlaceholder = "$month-from-now-date-time-start";
40
- const monthFromNowEndDateTimeParamPlaceholder = "$month-from-now-date-time-end";
41
- const yearAgoStartDateTimeParamPlaceholder = "$year-ago-date-time-start";
42
- const yearAgoEndDateTimeParamPlaceholder = "$year-ago-date-time-end";
43
- const yearFromNowStartDateTimeParamPlaceholder = "$year-from-now-date-time-start";
44
- const yearFromNowEndDateTimeParamPlaceholder = "$year-from-now-date-time-end";
45
- const paramsPlaceholdersLookup = {
46
- [todayDateParamPlaceholder]: () => serializeDate(moment__default["default"]()),
47
- [formulaTodayDateParamPlaceholder]: () => serializeDate(moment__default["default"]()),
48
- [formulaNowDateTimeParamPlaceholder]: () => serializeDateTime(moment__default["default"]()),
49
- [tomorrowDateParamPlaceholder]: () => serializeDate(moment__default["default"]().add(1, "days")),
50
- [yesterdayDateParamPlaceholder]: () => serializeDate(moment__default["default"]().subtract(1, "days")),
51
- [weekAgoDateParamPlaceholder]: () => serializeDate(moment__default["default"]().subtract(7, "days")),
52
- [weekFromNowDateParamPlaceholder]: () => serializeDate(moment__default["default"]().add(7, "days")),
53
- [monthAgoDateParamPlaceholder]: () => serializeDate(moment__default["default"]().subtract(1, "months")),
54
- [monthFromNowDateParamPlaceholder]: () => serializeDate(moment__default["default"]().add(1, "months")),
55
- [yearAgoDateParamPlaceholder]: () => serializeDate(moment__default["default"]().subtract(1, "year")),
56
- [yearFromNowDateParamPlaceholder]: () => serializeDate(moment__default["default"]().add(1, "year")),
57
- [todayStartDateTimeParamPlaceholder]: () => serializeDateTime(moment__default["default"]().startOf("day")),
58
- [todayEndDateTimeParamPlaceholder]: () => serializeDateTime(moment__default["default"]().endOf("day")),
59
- [tomorrowStartDateTimeParamPlaceholder]: () => serializeDateTime(moment__default["default"]().add(1, "days").startOf("day")),
60
- [tomorrowEndDateTimeParamPlaceholder]: () => serializeDateTime(moment__default["default"]().add(1, "days").endOf("day")),
61
- [yesterdayStartDateTimeParamPlaceholder]: () => serializeDateTime(moment__default["default"]().subtract(1, "days").startOf("day")),
62
- [yesterdayEndDateTimeParamPlaceholder]: () => serializeDateTime(moment__default["default"]().subtract(1, "days").endOf("day")),
63
- [weekAgoStartDateTimeParamPlaceholder]: () => serializeDateTime(moment__default["default"]().subtract(7, "days").startOf("day")),
64
- [weekAgoEndDateTimeParamPlaceholder]: () => serializeDateTime(moment__default["default"]().subtract(7, "days").endOf("day")),
65
- [weekFromNowStartDateTimeParamPlaceholder]: () => serializeDateTime(moment__default["default"]().add(7, "days").startOf("day")),
66
- [weekFromNowEndDateTimeParamPlaceholder]: () => serializeDateTime(moment__default["default"]().add(7, "days").endOf("day")),
67
- [monthAgoStartDateTimeParamPlaceholder]: () => serializeDateTime(moment__default["default"]().subtract(1, "months").startOf("day")),
68
- [monthAgoEndDateTimeParamPlaceholder]: () => serializeDateTime(moment__default["default"]().subtract(1, "months").endOf("day")),
69
- [monthFromNowStartDateTimeParamPlaceholder]: () => serializeDateTime(moment__default["default"]().add(1, "months").startOf("day")),
70
- [monthFromNowEndDateTimeParamPlaceholder]: () => serializeDateTime(moment__default["default"]().add(1, "months").endOf("day")),
71
- [yearAgoStartDateTimeParamPlaceholder]: () => serializeDateTime(moment__default["default"]().subtract(1, "year").startOf("day")),
72
- [yearAgoEndDateTimeParamPlaceholder]: () => serializeDateTime(moment__default["default"]().subtract(1, "year").endOf("day")),
73
- [yearFromNowStartDateTimeParamPlaceholder]: () => serializeDateTime(moment__default["default"]().add(1, "year").startOf("day")),
74
- [yearFromNowEndDateTimeParamPlaceholder]: () => serializeDateTime(moment__default["default"]().add(1, "year").endOf("day"))
75
- };
76
- const replacePlaceholdersInParams = params => params && ___default["default"].mapValues(params, (value, key) => {
77
- const replaceFn = paramsPlaceholdersLookup[key];
78
- if (replaceFn) {
79
- return replaceFn();
80
- }
81
- return value;
82
- });
83
- const dateToDateTimeIntervalLookup = {
84
- [todayDateParamPlaceholder]: {
85
- start: todayStartDateTimeParamPlaceholder,
86
- end: todayEndDateTimeParamPlaceholder
87
- },
88
- [tomorrowDateParamPlaceholder]: {
89
- start: tomorrowStartDateTimeParamPlaceholder,
90
- end: tomorrowEndDateTimeParamPlaceholder
91
- },
92
- [yesterdayDateParamPlaceholder]: {
93
- start: yesterdayStartDateTimeParamPlaceholder,
94
- end: yesterdayEndDateTimeParamPlaceholder
95
- },
96
- [weekAgoDateParamPlaceholder]: {
97
- start: weekAgoStartDateTimeParamPlaceholder,
98
- end: weekAgoEndDateTimeParamPlaceholder
99
- },
100
- [weekFromNowDateParamPlaceholder]: {
101
- start: weekFromNowStartDateTimeParamPlaceholder,
102
- end: weekFromNowEndDateTimeParamPlaceholder
103
- },
104
- [monthAgoDateParamPlaceholder]: {
105
- start: monthAgoStartDateTimeParamPlaceholder,
106
- end: monthAgoEndDateTimeParamPlaceholder
107
- },
108
- [monthFromNowDateParamPlaceholder]: {
109
- start: monthFromNowStartDateTimeParamPlaceholder,
110
- end: monthFromNowEndDateTimeParamPlaceholder
111
- },
112
- [yearAgoDateParamPlaceholder]: {
113
- start: yearAgoStartDateTimeParamPlaceholder,
114
- end: yearAgoEndDateTimeParamPlaceholder
115
- },
116
- [yearFromNowDateParamPlaceholder]: {
117
- start: yearFromNowStartDateTimeParamPlaceholder,
118
- end: yearFromNowEndDateTimeParamPlaceholder
119
- }
120
- };
121
-
122
- var paramsPlaceholders = {
123
- __proto__: null,
124
- formulaTodayDateParamPlaceholder: formulaTodayDateParamPlaceholder,
125
- formulaNowDateTimeParamPlaceholder: formulaNowDateTimeParamPlaceholder,
126
- todayDateParamPlaceholder: todayDateParamPlaceholder,
127
- tomorrowDateParamPlaceholder: tomorrowDateParamPlaceholder,
128
- yesterdayDateParamPlaceholder: yesterdayDateParamPlaceholder,
129
- weekAgoDateParamPlaceholder: weekAgoDateParamPlaceholder,
130
- weekFromNowDateParamPlaceholder: weekFromNowDateParamPlaceholder,
131
- monthAgoDateParamPlaceholder: monthAgoDateParamPlaceholder,
132
- monthFromNowDateParamPlaceholder: monthFromNowDateParamPlaceholder,
133
- yearAgoDateParamPlaceholder: yearAgoDateParamPlaceholder,
134
- yearFromNowDateParamPlaceholder: yearFromNowDateParamPlaceholder,
135
- todayStartDateTimeParamPlaceholder: todayStartDateTimeParamPlaceholder,
136
- todayEndDateTimeParamPlaceholder: todayEndDateTimeParamPlaceholder,
137
- tomorrowStartDateTimeParamPlaceholder: tomorrowStartDateTimeParamPlaceholder,
138
- tomorrowEndDateTimeParamPlaceholder: tomorrowEndDateTimeParamPlaceholder,
139
- yesterdayStartDateTimeParamPlaceholder: yesterdayStartDateTimeParamPlaceholder,
140
- yesterdayEndDateTimeParamPlaceholder: yesterdayEndDateTimeParamPlaceholder,
141
- weekAgoStartDateTimeParamPlaceholder: weekAgoStartDateTimeParamPlaceholder,
142
- weekAgoEndDateTimeParamPlaceholder: weekAgoEndDateTimeParamPlaceholder,
143
- weekFromNowStartDateTimeParamPlaceholder: weekFromNowStartDateTimeParamPlaceholder,
144
- weekFromNowEndDateTimeParamPlaceholder: weekFromNowEndDateTimeParamPlaceholder,
145
- monthAgoStartDateTimeParamPlaceholder: monthAgoStartDateTimeParamPlaceholder,
146
- monthAgoEndDateTimeParamPlaceholder: monthAgoEndDateTimeParamPlaceholder,
147
- monthFromNowStartDateTimeParamPlaceholder: monthFromNowStartDateTimeParamPlaceholder,
148
- monthFromNowEndDateTimeParamPlaceholder: monthFromNowEndDateTimeParamPlaceholder,
149
- yearAgoStartDateTimeParamPlaceholder: yearAgoStartDateTimeParamPlaceholder,
150
- yearAgoEndDateTimeParamPlaceholder: yearAgoEndDateTimeParamPlaceholder,
151
- yearFromNowStartDateTimeParamPlaceholder: yearFromNowStartDateTimeParamPlaceholder,
152
- yearFromNowEndDateTimeParamPlaceholder: yearFromNowEndDateTimeParamPlaceholder,
153
- paramsPlaceholdersLookup: paramsPlaceholdersLookup,
154
- replacePlaceholdersInParams: replacePlaceholdersInParams,
155
- dateToDateTimeIntervalLookup: dateToDateTimeIntervalLookup
156
- };
157
-
158
- function _extends() {
159
- _extends = Object.assign ? Object.assign.bind() : function (target) {
160
- for (var i = 1; i < arguments.length; i++) {
161
- var source = arguments[i];
162
- for (var key in source) {
163
- if (Object.prototype.hasOwnProperty.call(source, key)) {
164
- target[key] = source[key];
165
- }
166
- }
167
- }
168
- return target;
169
- };
170
- return _extends.apply(this, arguments);
171
- }
172
-
173
- const stringify = x => {
174
- if (x === undefined) {
175
- return "undefined";
176
- }
177
- return JSON.stringify(x);
178
- };
179
- class NotImplementedError extends Error {
180
- constructor(value, itemType = undefined) {
181
- super([`"${stringify(value)}"`, itemType, "is not implemented"].filter(x => x !== undefined).join(" "));
182
- }
183
- }
184
-
185
- const assertIsValidExpression = expression => {
186
- trace.assert(Array.isArray(expression), "expression must be array", {
187
- expression
188
- });
189
- trace.assert(expression.length > 0, "empty expression does not make any sense");
190
- };
191
- const dateRangeFunctions = new Set(["q/start", "q/end"]);
192
- const firstLastFunctions = new Set(["q/first", "q/last"]);
193
- const collectionOps = new Set(["q/count", "q/count-distinct", "q/sum", "q/min", "q/max", "q/avg", "q/join", "q/first", "q/last"]);
194
- // [op, left, right]
195
- // [=, $true, $false]
196
- // [=, $my-id, ["fibery/id"]]
197
- const binaryOperations = new Set(["=", "!=", "<", ">", "<=", ">=", "in",
198
- //asc: obsolete,use q/in
199
- "q/contains", "q/not-contains", "+", "-", "q/+", "q/-", "*", "/", "and", "or",
200
- //asc: obsolete. use q/and, q/or
201
- "q/and", "q/or", "q/in", "q/not-in"]);
202
-
203
- // TODO: get rid of this. Use visitors everywhere
204
- const naryOperations = new Set(["and", "or", "q/and", "q/or"]);
205
- const logicalOperators = new Set(["and", "or", "q/and", "q/or"]);
206
- const relationalOperators = new Set(["=", "!=", "<", ">", "<=", ">="]);
207
- const mathOperators = new Set(["+", "-", "*", "/", "q/+", "q/-", "q/concat"]);
208
- const isFunctionCallExpression = expression => expression.length > 1 && ___default["default"].isString(expression[0]) && (expression[0].startsWith("q/") || ["=", "!=", "<", ">", "<=", ">=", "+", "-", "*", "/", "in", "and", "or", "not-in"].includes(expression[0]));
209
- const fromRootKeyword = "q/from-root";
210
- const isFromRootFieldExpression = expression => ___default["default"].isArray(expression) && expression[0] === fromRootKeyword;
211
- const isDateRangeFunctionExpression = expression => (expression.length === 2 || expression.length === 3) && dateRangeFunctions.has(expression[0]) && isFieldExpression(expression[1]);
212
- const isCollectionFunctionExpression = expression =>
213
- //expression has length 3 in case of q/join
214
- (expression.length === 2 || expression.length === 3) && collectionOps.has(expression[0]);
215
- const isAccessFunctionExpression = expresion => expresion.length === 2 && expresion[0] === "q/access?" && isFieldExpression(expresion[1]);
216
- const isBinaryExpression = expression => expression.length === 3 && binaryOperations.has(expression[0]);
217
- const isNaryExpression = expression => expression.length > 1 && naryOperations.has(expression[0]);
218
- const isVariableExpression = expression => ___default["default"].isString(expression) && expression.startsWith("$");
219
- const isFieldExpression = expression => Array.isArray(expression) && expression.every(x => !isVariableExpression(x) && !binaryOperations.has(x) && ___default["default"].isString(x));
220
- const isQueryExpression = expression => {
221
- if (___default["default"].isObject(expression) && "q/from" in expression) {
222
- const fromExpression = expression["q/from"];
223
- //asc: fromExpression === null for denormalizeSelect for reference collection case
224
- return fromExpression === null || isFieldExpression(fromExpression);
225
- }
226
- return false;
227
- };
228
- // [q/count, [..., collection]]
229
- // [q/start, [..., range]]
230
- // [q/end, [..., range]]
231
- // [q/access?, [..., field-expr]]
232
- const isFunctionExpression = expression => {
233
- if (!Array.isArray(expression)) {
234
- return false;
235
- }
236
- if (isFieldExpression(expression)) {
237
- return false;
238
- } else if (isDateRangeFunctionExpression(expression) || isCollectionFunctionExpression(expression) || isAccessFunctionExpression(expression)) {
239
- return true;
240
- }
241
- throw new Error("invalid expression:" + JSON.stringify(expression));
242
- };
243
- const collectFieldExpressions = (memo, expression) => {
244
- if (isVariableExpression(expression)) ; else if (isFunctionCallExpression(expression)) {
245
- for (const part of expression.slice(1)) {
246
- if (isVariableExpression(part) || part === null) ; else {
247
- if (___default["default"].isString(part)) {
248
- // field path shortcut
249
- memo.push([part]);
250
- } else {
251
- collectFieldExpressions(memo, part);
252
- }
253
- }
254
- }
255
- } else if (isFieldExpression(expression)) {
256
- memo.push(expression);
257
- } else if (expression["q/from"] && isFieldExpression(expression["q/from"])) {
258
- const innerMemo = [];
259
- expression["q/select"] && collectFieldExpressions(innerMemo, expression["q/select"]);
260
- expression["q/where"] && collectFieldExpressions(innerMemo, expression["q/where"]);
261
- for (const fieldExpression of innerMemo) {
262
- memo.push([...expression["q/from"], ...fieldExpression]);
263
- }
264
- } else {
265
- throw new NotImplementedError(expression, "expression");
266
- }
267
- };
268
- const extractFieldExpressions = expression => {
269
- const memo = [];
270
- collectFieldExpressions(memo, expression);
271
- return ___default["default"].uniqBy(memo, x => x.join(","));
272
- };
273
- const createExpressionVisitor = visitor => {
274
- let visitorWithDefault = null;
275
- const visitorDefault = {
276
- visitVariableExpression: expression => expression,
277
- visitFunctionCallExpression: ([fnName, ...args]) => [fnName, ...args.map(x => visitorWithDefault.visitExpression(x))],
278
- visitFromRootFieldExpression: ([fromRootKeyword, ...rest]) => [fromRootKeyword, ...rest.map(x => visitorWithDefault.visitExpression(x))],
279
- visitFieldExpression: expression => expression,
280
- visitOrderByExpression: orderByExpression => orderByExpression.map(x => {
281
- const [fieldExpression, orderDir] = x;
282
- const fieldExpressionNew = visitorWithDefault.visitExpression(fieldExpression);
283
- return [fieldExpressionNew, orderDir];
284
- }),
285
- visitQueryExpression: subQueryExpression => {
286
- const {
287
- "q/from": fromExpression,
288
- "q/select": selectExpression,
289
- "q/where": whereExpression,
290
- "q/order-by": orderByExpression
291
- } = subQueryExpression;
292
- return _extends({}, subQueryExpression, fromExpression ? {
293
- "q/from": visitorWithDefault.visitFieldExpression(fromExpression)
294
- } : null, selectExpression ? {
295
- "q/select": ___default["default"].isPlainObject(selectExpression) ? ___default["default"].mapValues(selectExpression, val => visitorWithDefault.visitExpression(val)) : visitorWithDefault.visitExpression(selectExpression)
296
- } : null, whereExpression ? {
297
- "q/where": visitorWithDefault.visitExpression(whereExpression)
298
- } : null, orderByExpression ? {
299
- "q/order-by": visitorWithDefault.visitOrderByExpression(orderByExpression)
300
- } : null);
301
- },
302
- visitExpression: expression => {
303
- if (expression === null) {
304
- throw new NotImplementedError(expression, "expression");
305
- } else if (isVariableExpression(expression)) {
306
- return visitorWithDefault.visitVariableExpression(expression, visitorDefault);
307
- } else if (isFromRootFieldExpression(expression)) {
308
- return visitorWithDefault.visitFromRootFieldExpression(expression, visitorDefault);
309
- } else if (isFunctionCallExpression(expression)) {
310
- return visitorWithDefault.visitFunctionCallExpression(expression, visitorDefault);
311
- } else if (isFieldExpression(expression)) {
312
- return visitorWithDefault.visitFieldExpression(expression, visitorDefault);
313
- } else if (isQueryExpression(expression)) {
314
- return visitorWithDefault.visitQueryExpression(expression, visitorDefault);
315
- } else {
316
- throw new NotImplementedError(expression, "expression");
317
- }
318
- }
319
- };
320
- visitorWithDefault = _extends({}, visitorDefault, visitor);
321
- return visitorWithDefault;
322
- };
323
-
324
- var utils = {
325
- __proto__: null,
326
- assertIsValidExpression: assertIsValidExpression,
327
- dateRangeFunctions: dateRangeFunctions,
328
- firstLastFunctions: firstLastFunctions,
329
- logicalOperators: logicalOperators,
330
- relationalOperators: relationalOperators,
331
- mathOperators: mathOperators,
332
- isFunctionCallExpression: isFunctionCallExpression,
333
- fromRootKeyword: fromRootKeyword,
334
- isFromRootFieldExpression: isFromRootFieldExpression,
335
- isDateRangeFunctionExpression: isDateRangeFunctionExpression,
336
- isCollectionFunctionExpression: isCollectionFunctionExpression,
337
- isAccessFunctionExpression: isAccessFunctionExpression,
338
- isBinaryExpression: isBinaryExpression,
339
- isNaryExpression: isNaryExpression,
340
- isVariableExpression: isVariableExpression,
341
- isFieldExpression: isFieldExpression,
342
- isQueryExpression: isQueryExpression,
343
- isFunctionExpression: isFunctionExpression,
344
- extractFieldExpressions: extractFieldExpressions,
345
- createExpressionVisitor: createExpressionVisitor
346
- };
347
-
348
- const defaultIdsWithNamesOnFieldNotFound = ({
349
- fieldExpressionInNamesTerms,
350
- fieldId
351
- }) => {
352
- return {
353
- currentTypeObject: null,
354
- fieldExpressionInNamesTerms: [...fieldExpressionInNamesTerms, fieldId]
355
- };
356
- };
357
- const visitFieldExpressionForReplaceIdsWithNamesVisitor = ({
358
- expression,
359
- typeObject,
360
- onFieldNotFound
361
- }) => expression.reduce(({
362
- currentTypeObject,
363
- fieldExpressionInNamesTerms
364
- }, fieldId) => {
365
- if (currentTypeObject && currentTypeObject.fieldObjectsById.hasOwnProperty(fieldId)) {
366
- const fieldObject = currentTypeObject.fieldObjectsById[fieldId];
367
- return {
368
- currentTypeObject: fieldObject.typeObject,
369
- fieldExpressionInNamesTerms: [...fieldExpressionInNamesTerms, fieldObject.name]
370
- };
371
- } else {
372
- return onFieldNotFound({
373
- currentTypeObject,
374
- fieldExpressionInNamesTerms,
375
- fieldId,
376
- expression
377
- });
378
- }
379
- }, {
380
- currentTypeObject: typeObject,
381
- fieldExpressionInNamesTerms: []
382
- });
383
- const replaceIdsWithNamesVisitor = (typeObject, onFieldNotFound = defaultIdsWithNamesOnFieldNotFound) => {
384
- const visitor = createExpressionVisitor({
385
- visitFieldExpression: expression => visitFieldExpressionForReplaceIdsWithNamesVisitor({
386
- expression,
387
- typeObject,
388
- onFieldNotFound
389
- }).fieldExpressionInNamesTerms,
390
- visitQueryExpression: subQueryExpression => {
391
- const {
392
- "q/from": fromExpression,
393
- "q/select": selectExpression,
394
- "q/where": whereExpression,
395
- "q/order-by": orderByExpression
396
- } = subQueryExpression;
397
- const subQueryTypeObject = visitFieldExpressionForReplaceIdsWithNamesVisitor({
398
- expression: fromExpression,
399
- onFieldNotFound,
400
- typeObject
401
- }).currentTypeObject;
402
- if (subQueryTypeObject) {
403
- const subQueryVisitor = replaceIdsWithNamesVisitor(subQueryTypeObject, onFieldNotFound);
404
- return _extends({}, subQueryExpression, {
405
- "q/from": visitor.visitFieldExpression(fromExpression),
406
- "q/select": ___default["default"].isPlainObject(selectExpression) ? ___default["default"].mapValues(selectExpression, val => subQueryVisitor.visitExpression(val)) : subQueryVisitor.visitExpression(selectExpression)
407
- }, whereExpression ? {
408
- "q/where": subQueryVisitor.visitExpression(whereExpression)
409
- } : null, orderByExpression ? {
410
- "q/order-by": subQueryVisitor.visitOrderByExpression(orderByExpression)
411
- } : null);
412
- }
413
- return subQueryExpression;
414
- }
415
- });
416
- return visitor;
417
- };
418
- const defaultNamesWithIdsOnFieldNotFound = ({
419
- fieldExpressionInIdsTerms,
420
- field
421
- }) => {
422
- return {
423
- currentTypeObject: null,
424
- fieldExpressionInIdsTerms: [...fieldExpressionInIdsTerms, field]
425
- };
426
- };
427
- const visitFieldExpressionForReplaceNamesWithIdsVisitor = ({
428
- expression,
429
- onFieldNotFound,
430
- typeObject
431
- }) => expression.reduce(({
432
- currentTypeObject,
433
- fieldExpressionInIdsTerms
434
- }, field) => {
435
- if (currentTypeObject && currentTypeObject.fieldObjectsByName.hasOwnProperty(field)) {
436
- const fieldObject = currentTypeObject.fieldObjectsByName[field];
437
- return {
438
- currentTypeObject: fieldObject.typeObject,
439
- fieldExpressionInIdsTerms: [...fieldExpressionInIdsTerms, fieldObject.id]
440
- };
441
- } else {
442
- return onFieldNotFound({
443
- currentTypeObject,
444
- fieldExpressionInIdsTerms,
445
- field,
446
- expression
447
- });
448
- }
449
- }, {
450
- currentTypeObject: typeObject,
451
- fieldExpressionInIdsTerms: []
452
- });
453
- const replaceNamesWithIdsVisitor = (typeObject, onFieldNotFound = defaultNamesWithIdsOnFieldNotFound) => {
454
- const visitor = createExpressionVisitor({
455
- visitFieldExpression: expression => visitFieldExpressionForReplaceNamesWithIdsVisitor({
456
- expression,
457
- onFieldNotFound,
458
- typeObject
459
- }).fieldExpressionInIdsTerms,
460
- visitQueryExpression: subQueryExpression => {
461
- const {
462
- "q/from": fromExpression,
463
- "q/select": selectExpression,
464
- "q/where": whereExpression,
465
- "q/order-by": orderByExpression
466
- } = subQueryExpression;
467
- const subQueryTypeObject = visitFieldExpressionForReplaceNamesWithIdsVisitor({
468
- expression: fromExpression,
469
- onFieldNotFound,
470
- typeObject
471
- }).currentTypeObject;
472
- if (subQueryTypeObject) {
473
- const subQueryVisitor = replaceNamesWithIdsVisitor(subQueryTypeObject, onFieldNotFound);
474
- return _extends({}, subQueryExpression, {
475
- "q/from": visitor.visitFieldExpression(fromExpression),
476
- "q/select": ___default["default"].isPlainObject(selectExpression) ? ___default["default"].mapValues(selectExpression, val => subQueryVisitor.visitExpression(val)) : subQueryVisitor.visitExpression(selectExpression)
477
- }, whereExpression ? {
478
- "q/where": subQueryVisitor.visitExpression(whereExpression)
479
- } : null, orderByExpression ? {
480
- "q/order-by": subQueryVisitor.visitOrderByExpression(orderByExpression)
481
- } : null);
482
- }
483
- return subQueryExpression;
484
- }
485
- });
486
- return visitor;
487
- };
488
- const deleteExpressionsWithNotFoundFieldsVisitor = typeObject => {
489
- const visitor = createExpressionVisitor({
490
- visitFunctionCallExpression: ([fnName, ...args]) => {
491
- const argsNew = args.map(x => visitor.visitExpression(x)).filter(Boolean);
492
- if (logicalOperators.has(fnName)) {
493
- if (argsNew.length > 0) {
494
- return argsNew.length === 1 ? argsNew[0] : [fnName, ...argsNew];
495
- }
496
- return null;
497
- } else {
498
- return argsNew.length === args.length ? [fnName, ...argsNew] : null;
499
- }
500
- },
501
- visitFieldExpression: expression => {
502
- const fieldTypeObject = expression.reduce((holderTypeObject, field) => holderTypeObject && holderTypeObject.fieldObjectsByName.hasOwnProperty(field) ? holderTypeObject.fieldObjectsByName[field].typeObject : null, typeObject);
503
- return fieldTypeObject && expression;
504
- },
505
- visitOrderByExpression: orderByExpression => {
506
- return orderByExpression.map(x => {
507
- const [fieldExpression, orderDir] = x;
508
- const fieldExpressionNew = visitor.visitExpression(fieldExpression);
509
- return fieldExpressionNew && [fieldExpressionNew, orderDir];
510
- }).filter(Boolean);
511
- },
512
- visitQueryExpression: subQueryExpression => {
513
- const {
514
- "q/from": fromExpression,
515
- "q/select": selectExpression,
516
- "q/where": whereExpression,
517
- "q/order-by": orderByExpression
518
- } = subQueryExpression;
519
- const subQueryTypeObject = fromExpression.reduce((typeObject, field) => typeObject && typeObject.fieldObjectsByName.hasOwnProperty(field) ? typeObject.fieldObjectsByName[field].typeObject : null, typeObject);
520
- if (subQueryTypeObject) {
521
- const subQueryVisitor = deleteExpressionsWithNotFoundFieldsVisitor(subQueryTypeObject);
522
- const subQueryExpressionNew = ___default["default"].pickBy(_extends({}, subQueryExpression, {
523
- "q/from": visitor.visitFieldExpression(fromExpression),
524
- "q/select": subQueryVisitor.visitExpression(selectExpression)
525
- }, whereExpression ? {
526
- "q/where": subQueryVisitor.visitExpression(whereExpression)
527
- } : null, orderByExpression ? {
528
- "q/order-by": subQueryVisitor.visitOrderByExpression(orderByExpression)
529
- } : null));
530
- const {
531
- "q/select": selectExpressionNew
532
- } = subQueryExpressionNew;
533
- return selectExpressionNew ? subQueryExpressionNew : null;
534
- } else {
535
- return null;
536
- }
537
- }
538
- });
539
- return visitor;
540
- };
541
- const expressionContainsAggregation = expression => {
542
- let result = false;
543
- const visitor = createExpressionVisitor({
544
- visitQueryExpression: queryExpression => {
545
- const {
546
- "q/select": selectExpression
547
- } = queryExpression;
548
- if (isCollectionFunctionExpression(selectExpression)) {
549
- result = true;
550
- }
551
- },
552
- visitFunctionCallExpression: (expression, visitorDefault) => {
553
- if (firstLastFunctions.has(expression[0])) {
554
- result = true;
555
- } else {
556
- visitorDefault.visitFunctionCallExpression(expression);
557
- }
558
- }
559
- });
560
- visitor.visitExpression(expression);
561
- return result;
562
- };
563
- const defaultGetExpressionTypeOnFieldNotFound = () => {
564
- return {
565
- currentTypeObject: null
566
- };
567
- };
568
- const getFieldAccessExpressionTypeObject = ({
569
- expression,
570
- typeObject,
571
- onFieldNotFound,
572
- returnRefTypeInsteadOfId
573
- }) => {
574
- const reduced = expression.reduce(({
575
- currentTypeObject
576
- }, fieldId, index) => {
577
- const fieldObject = currentTypeObject && currentTypeObject.fieldObjects.find(f => f.id === fieldId);
578
- if (fieldObject) {
579
- if (returnRefTypeInsteadOfId && index === expression.length - 1 && fieldObject.isId) {
580
- return {
581
- currentTypeObject
582
- };
583
- }
584
- return {
585
- currentTypeObject: fieldObject.typeObject
586
- };
587
- } else {
588
- return onFieldNotFound({
589
- currentTypeObject,
590
- fieldId
591
- });
592
- }
593
- }, {
594
- currentTypeObject: typeObject
595
- });
596
- return reduced.currentTypeObject;
597
- };
598
- const UNKNOWN_EXPRESSION_TYPE = "unknown";
599
- const getExpressionTypeInternal = ({
600
- expression,
601
- typeObject,
602
- functionsMeta,
603
- onFieldNotFound,
604
- returnRefTypeInsteadOfId
605
- }) => {
606
- let result = null;
607
- const visitor = createExpressionVisitor({
608
- visitVariableExpression: function () {
609
- result = UNKNOWN_EXPRESSION_TYPE;
610
- },
611
- visitFunctionCallExpression: function ([fnName, ...args]) {
612
- const fnMeta = functionsMeta[fnName];
613
- if (!fnMeta) {
614
- throw new Error(`Function meta for "${fnName}" was not provided`);
615
- }
616
- const argTypes = args.map(arg => getExpressionTypeInternal({
617
- expression: arg,
618
- typeObject,
619
- functionsMeta,
620
- onFieldNotFound,
621
- returnRefTypeInsteadOfId: false
622
- }));
623
- const overload = fnMeta.overloads.find(o => o["arg-types"].every((argType, index) => argTypes[index] === UNKNOWN_EXPRESSION_TYPE || argTypes[index] === argType));
624
- if (!overload) {
625
- throw new Error(`No overload with args ${argTypes.join(",")} found for "${fnName}" in meta`);
626
- }
627
- result = overload["result-type"];
628
- },
629
- visitQueryExpression: expression => {
630
- const {
631
- "q/from": fromExpression,
632
- "q/select": selectExpression
633
- } = expression;
634
- const fromTypeObject = getFieldAccessExpressionTypeObject({
635
- expression: fromExpression,
636
- typeObject,
637
- onFieldNotFound,
638
- returnRefTypeInsteadOfId
639
- });
640
- if (!fromTypeObject) {
641
- result = null;
642
- }
643
- if (___default["default"].isPlainObject(selectExpression)) {
644
- if (Object.values(selectExpression).length !== 1) {
645
- throw new Error(`Cannot determine type of query expression ${JSON.stringify(expression)}`);
646
- }
647
- result = getExpressionTypeInternal({
648
- expression: Object.values(selectExpression)[0],
649
- typeObject: fromTypeObject,
650
- functionsMeta,
651
- onFieldNotFound,
652
- returnRefTypeInsteadOfId
653
- });
654
- } else {
655
- result = getExpressionTypeInternal({
656
- expression: selectExpression,
657
- typeObject: fromTypeObject,
658
- functionsMeta,
659
- onFieldNotFound,
660
- returnRefTypeInsteadOfId
661
- });
662
- }
663
- },
664
- visitFieldExpression(expression) {
665
- const fieldAccessExpressionTypeObject = getFieldAccessExpressionTypeObject({
666
- expression,
667
- typeObject,
668
- onFieldNotFound,
669
- returnRefTypeInsteadOfId
670
- });
671
- result = fieldAccessExpressionTypeObject && fieldAccessExpressionTypeObject.name;
672
- }
673
- });
674
- visitor.visitExpression(expression);
675
- return result;
676
- };
677
- const getExpressionType = ({
678
- expression,
679
- typeObject,
680
- functionsMeta,
681
- onFieldNotFound = defaultGetExpressionTypeOnFieldNotFound,
682
- returnRefTypeInsteadOfId = true
683
- }) => {
684
- return getExpressionTypeInternal({
685
- expression,
686
- typeObject,
687
- functionsMeta,
688
- onFieldNotFound,
689
- returnRefTypeInsteadOfId
690
- });
691
- };
692
-
693
- var visitors = {
694
- __proto__: null,
695
- replaceIdsWithNamesVisitor: replaceIdsWithNamesVisitor,
696
- replaceNamesWithIdsVisitor: replaceNamesWithIdsVisitor,
697
- deleteExpressionsWithNotFoundFieldsVisitor: deleteExpressionsWithNotFoundFieldsVisitor,
698
- expressionContainsAggregation: expressionContainsAggregation,
699
- UNKNOWN_EXPRESSION_TYPE: UNKNOWN_EXPRESSION_TYPE,
700
- getExpressionType: getExpressionType
701
- };
702
-
703
- const getEntityQueryVariables = schema => {
704
- const grouped = ___default["default"].groupBy(schema.typeObjects.filter(x => x.isDomain), typeObject => typeObject.pluralTitle);
705
- return ___default["default"].flatten(Object.values(grouped).map(group => {
706
- return group.map(typeObject => ({
707
- typeObject,
708
- id: `entityQuery_${typeObject.id}`,
709
- title: group.length > 1 ? `${typeObject.pluralTitle} (${typeObject.nameParts.namespace})` : typeObject.pluralTitle,
710
- isCollection: true,
711
- description: `All Entities from "${typeObject.title}" Database`
712
- }));
713
- }));
714
- };
715
-
716
- var contextVariables = {
717
- __proto__: null,
718
- getEntityQueryVariables: getEntityQueryVariables
719
- };
720
-
721
- exports.contextVariables = contextVariables;
722
- exports.paramsPlaceholders = paramsPlaceholders;
723
- exports.utils = utils;
724
- exports.visitors = visitors;