@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 +4 -7
- package/dist/index.js +58 -20
- package/dist/index.js.map +3 -3
- package/dist/index.js.meta.json +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +3 -3
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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 :
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
11183
|
-
|
|
11184
|
-
|
|
11185
|
-
|
|
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
|
-
|
|
11188
|
-
|
|
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
|
-
|
|
11227
|
+
return false;
|
|
11228
|
+
};
|
|
11229
|
+
return check(query);
|
|
11192
11230
|
};
|
|
11193
11231
|
|
|
11194
11232
|
// src/utils.ts
|