@budibase/shared-core 2.31.8 → 2.32.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.
package/dist/filters.d.ts CHANGED
@@ -66,16 +66,13 @@ export declare class ColumnSplitter {
66
66
  */
67
67
  export declare const buildQuery: (filter: SearchFilter[]) => SearchFilters;
68
68
  export declare function fixupFilterArrays(filters: SearchFilters): SearchFilters;
69
- export declare const search: (docs: Record<string, any>[], query: RowSearchParams) => SearchResponse<Record<string, any>>;
69
+ export declare function search<T>(docs: Record<string, T>[], query: RowSearchParams): SearchResponse<Record<string, T>>;
70
70
  /**
71
71
  * Performs a client-side search on an array of data
72
72
  * @param docs the data
73
73
  * @param query the JSON query
74
- * @param findInDoc optional fn when trying to extract a value
75
- * from custom doc type e.g. Google Sheets
76
- *
77
74
  */
78
- export declare const runQuery: (docs: Record<string, any>[], query: SearchFilters, findInDoc?: Function) => Record<string, any>[];
75
+ export declare function runQuery<T extends Record<string, any>>(docs: T[], query: SearchFilters): T[];
79
76
  /**
80
77
  * Performs a client-side sort from the equivalent server-side lucene sort
81
78
  * parameters.
@@ -84,12 +81,12 @@ export declare const runQuery: (docs: Record<string, any>[], query: SearchFilter
84
81
  * @param sortOrder the sort order ("ascending" or "descending")
85
82
  * @param sortType the type of sort ("string" or "number")
86
83
  */
87
- export declare const sort: (docs: any[], sort: string, sortOrder: SortOrder, sortType?: SortType) => any[];
84
+ export declare function sort<T extends Record<string, any>>(docs: T[], sort: keyof T, sortOrder: SortOrder, sortType?: SortType): T[];
88
85
  /**
89
86
  * Limits the specified docs to the specified number of rows from the equivalent
90
87
  * server-side lucene limit parameters.
91
88
  * @param docs the data
92
89
  * @param limit the number of docs to limit to
93
90
  */
94
- export declare const limit: (docs: any[], limit: string) => any[];
91
+ export declare function limit<T>(docs: T[], limit: string): T[];
95
92
  export declare const hasFilters: (query?: SearchFilters) => boolean;
package/dist/index.js CHANGED
@@ -10082,6 +10082,15 @@ var UserGroupSyncEvents = [
10082
10082
  var AsyncEvents = [...UserGroupSyncEvents];
10083
10083
 
10084
10084
  // ../types/src/sdk/search.ts
10085
+ var BasicOperator = /* @__PURE__ */ ((BasicOperator2) => {
10086
+ BasicOperator2["EQUAL"] = "equal";
10087
+ BasicOperator2["NOT_EQUAL"] = "notEqual";
10088
+ BasicOperator2["EMPTY"] = "empty";
10089
+ BasicOperator2["NOT_EMPTY"] = "notEmpty";
10090
+ BasicOperator2["FUZZY"] = "fuzzy";
10091
+ BasicOperator2["STRING"] = "string";
10092
+ return BasicOperator2;
10093
+ })(BasicOperator || {});
10085
10094
  var ArrayOperator = /* @__PURE__ */ ((ArrayOperator2) => {
10086
10095
  ArrayOperator2["CONTAINS"] = "contains";
10087
10096
  ArrayOperator2["NOT_CONTAINS"] = "notContains";
@@ -10089,6 +10098,10 @@ var ArrayOperator = /* @__PURE__ */ ((ArrayOperator2) => {
10089
10098
  ArrayOperator2["ONE_OF"] = "oneOf";
10090
10099
  return ArrayOperator2;
10091
10100
  })(ArrayOperator || {});
10101
+ var RangeOperator = /* @__PURE__ */ ((RangeOperator2) => {
10102
+ RangeOperator2["RANGE"] = "range";
10103
+ return RangeOperator2;
10104
+ })(RangeOperator || {});
10092
10105
  var LogicalOperator = /* @__PURE__ */ ((LogicalOperator2) => {
10093
10106
  LogicalOperator2["AND"] = "$and";
10094
10107
  LogicalOperator2["OR"] = "$or";
@@ -10603,6 +10616,12 @@ function decodeNonAscii(str) {
10603
10616
  // src/filters.ts
10604
10617
  var import_lodash = __toESM(require_lodash());
10605
10618
  var HBS_REGEX = /{{([^{].*?)}}/g;
10619
+ var LOGICAL_OPERATORS = Object.values(LogicalOperator);
10620
+ var SEARCH_OPERATORS = [
10621
+ ...Object.values(BasicOperator),
10622
+ ...Object.values(ArrayOperator),
10623
+ ...Object.values(RangeOperator)
10624
+ ];
10606
10625
  var getValidOperatorsForType = (fieldType, field, datasource) => {
10607
10626
  const Op = OperatorOptions;
10608
10627
  const stringOps = [
@@ -10663,7 +10682,7 @@ var NoEmptyFilterStrings = [
10663
10682
  OperatorOptions.In.value
10664
10683
  ];
10665
10684
  function recurseLogicalOperators(filters, fn) {
10666
- for (const logical of Object.values(LogicalOperator)) {
10685
+ for (const logical of LOGICAL_OPERATORS) {
10667
10686
  if (filters[logical]) {
10668
10687
  filters[logical].conditions = filters[logical].conditions.map(
10669
10688
  (condition) => fn(condition)
@@ -10674,7 +10693,7 @@ function recurseLogicalOperators(filters, fn) {
10674
10693
  }
10675
10694
  function recurseSearchFilters(filters, processFn) {
10676
10695
  filters = processFn(filters);
10677
- for (const logical of Object.values(LogicalOperator)) {
10696
+ for (const logical of LOGICAL_OPERATORS) {
10678
10697
  if (filters[logical]) {
10679
10698
  filters[logical].conditions = filters[logical].conditions.map(
10680
10699
  (condition) => recurseSearchFilters(condition, processFn)
@@ -10891,7 +10910,7 @@ function fixupFilterArrays(filters) {
10891
10910
  recurseLogicalOperators(filters, fixupFilterArrays);
10892
10911
  return filters;
10893
10912
  }
10894
- var search = (docs, query) => {
10913
+ function search(docs, query) {
10895
10914
  let result = runQuery(docs, query.query);
10896
10915
  if (query.sort) {
10897
10916
  result = sort(result, query.sort, query.sortOrder || "ascending" /* ASCENDING */);
@@ -10905,8 +10924,8 @@ var search = (docs, query) => {
10905
10924
  response.totalRows = totalRows;
10906
10925
  }
10907
10926
  return response;
10908
- };
10909
- var runQuery = (docs, query, findInDoc = deepGet) => {
10927
+ }
10928
+ function runQuery(docs, query) {
10910
10929
  if (!docs || !Array.isArray(docs)) {
10911
10930
  return [];
10912
10931
  }
@@ -10920,7 +10939,7 @@ var runQuery = (docs, query, findInDoc = deepGet) => {
10920
10939
  }
10921
10940
  const match = (type, test) => (doc) => {
10922
10941
  for (const [key, testValue] of Object.entries(query[type] || {})) {
10923
- const valueToCheck = isLogicalSearchOperator(type) ? doc : findInDoc(doc, removeKeyNumbering(key));
10942
+ const valueToCheck = isLogicalSearchOperator(type) ? doc : deepGet(doc, removeKeyNumbering(key));
10924
10943
  const result = test(valueToCheck, testValue);
10925
10944
  if (query.allOr && result) {
10926
10945
  return true;
@@ -11137,15 +11156,17 @@ var runQuery = (docs, query, findInDoc = deepGet) => {
11137
11156
  ).map(([key]) => {
11138
11157
  return filterFunctions[key]?.(doc) ?? false;
11139
11158
  });
11140
- if (query.allOr) {
11159
+ if (!hasFilters(query)) {
11160
+ return true;
11161
+ } else if (query.allOr) {
11141
11162
  return results.some((result) => result === true);
11142
11163
  } else {
11143
11164
  return results.every((result) => result === true);
11144
11165
  }
11145
11166
  };
11146
11167
  return docs.filter(docMatch);
11147
- };
11148
- var sort = (docs, sort2, sortOrder, sortType = "string" /* STRING */) => {
11168
+ }
11169
+ function sort(docs, sort2, sortOrder, sortType = "string" /* STRING */) {
11149
11170
  if (!sort2 || !sortOrder || !sortType) {
11150
11171
  return docs;
11151
11172
  }
@@ -11167,28 +11188,45 @@ var sort = (docs, sort2, sortOrder, sortType = "string" /* STRING */) => {
11167
11188
  }
11168
11189
  return result;
11169
11190
  });
11170
- };
11171
- var limit = (docs, limit2) => {
11191
+ }
11192
+ function limit(docs, limit2) {
11172
11193
  const numLimit = parseFloat(limit2);
11173
11194
  if (isNaN(numLimit)) {
11174
11195
  return docs;
11175
11196
  }
11176
11197
  return docs.slice(0, numLimit);
11177
- };
11198
+ }
11178
11199
  var hasFilters = (query) => {
11179
11200
  if (!query) {
11180
11201
  return false;
11181
11202
  }
11182
- const skipped = ["allOr", "onEmptyFilter"];
11183
- for (let [key, value] of Object.entries(query)) {
11184
- if (skipped.includes(key) || typeof value !== "object") {
11185
- continue;
11203
+ const check = (filters) => {
11204
+ for (const logical of LOGICAL_OPERATORS) {
11205
+ if (filters[logical]) {
11206
+ for (const condition of filters[logical]?.conditions || []) {
11207
+ const result = check(condition);
11208
+ if (result) {
11209
+ return result;
11210
+ }
11211
+ }
11212
+ }
11186
11213
  }
11187
- if (Object.keys(value || {}).length !== 0) {
11188
- return true;
11214
+ for (const search2 of SEARCH_OPERATORS) {
11215
+ const searchValue = filters[search2];
11216
+ if (!searchValue || typeof searchValue !== "object") {
11217
+ continue;
11218
+ }
11219
+ const filtered = Object.entries(searchValue).filter((entry) => {
11220
+ const valueDefined = entry[1] !== void 0 || entry[1] !== null || entry[1] !== "";
11221
+ return search2 === "notEmpty" /* NOT_EMPTY */ || valueDefined;
11222
+ });
11223
+ if (filtered.length !== 0) {
11224
+ return true;
11225
+ }
11189
11226
  }
11190
- }
11191
- return false;
11227
+ return false;
11228
+ };
11229
+ return check(query);
11192
11230
  };
11193
11231
 
11194
11232
  // src/utils.ts