inibase 1.0.0-rc.3 → 1.0.0-rc.4
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/README.md +1 -1
- package/file.ts +19 -14
- package/index.ts +135 -106
- package/package.json +1 -1
package/README.md
CHANGED
package/file.ts
CHANGED
|
@@ -183,11 +183,17 @@ export const search = async (
|
|
|
183
183
|
// check if not array or object
|
|
184
184
|
switch (operator) {
|
|
185
185
|
case "=":
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
186
|
+
switch (fieldType) {
|
|
187
|
+
case "password":
|
|
188
|
+
return typeof value === "string" &&
|
|
189
|
+
typeof comparedAtValue === "string"
|
|
190
|
+
? Utils.comparePassword(value, comparedAtValue)
|
|
191
|
+
: false;
|
|
192
|
+
case "boolean":
|
|
193
|
+
return Number(value) - Number(comparedAtValue) === 0;
|
|
194
|
+
default:
|
|
195
|
+
return value === comparedAtValue;
|
|
196
|
+
}
|
|
191
197
|
case "!=":
|
|
192
198
|
return !handleComparisonOperator(
|
|
193
199
|
"=",
|
|
@@ -268,8 +274,7 @@ export const search = async (
|
|
|
268
274
|
lineCount++;
|
|
269
275
|
const decodedLine = Utils.decode(line, fieldType);
|
|
270
276
|
if (
|
|
271
|
-
|
|
272
|
-
((Array.isArray(operator) &&
|
|
277
|
+
(Array.isArray(operator) &&
|
|
273
278
|
Array.isArray(comparedAtValue) &&
|
|
274
279
|
((logicalOperator &&
|
|
275
280
|
logicalOperator === "or" &&
|
|
@@ -289,13 +294,13 @@ export const search = async (
|
|
|
289
294
|
fieldType
|
|
290
295
|
)
|
|
291
296
|
))) ||
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
297
|
+
(!Array.isArray(operator) &&
|
|
298
|
+
handleComparisonOperator(
|
|
299
|
+
operator,
|
|
300
|
+
decodedLine,
|
|
301
|
+
comparedAtValue,
|
|
302
|
+
fieldType
|
|
303
|
+
))
|
|
299
304
|
) {
|
|
300
305
|
foundItems++;
|
|
301
306
|
if (offset && foundItems < offset) continue;
|
package/index.ts
CHANGED
|
@@ -79,13 +79,23 @@ type pageInfo = {
|
|
|
79
79
|
|
|
80
80
|
export type Criteria =
|
|
81
81
|
| {
|
|
82
|
-
[logic in "and" | "or"]?: Criteria;
|
|
82
|
+
[logic in "and" | "or"]?: Criteria | (string | number | boolean | null)[];
|
|
83
83
|
}
|
|
84
84
|
| {
|
|
85
85
|
[key: string]: string | number | boolean | Criteria;
|
|
86
86
|
}
|
|
87
87
|
| null;
|
|
88
88
|
|
|
89
|
+
declare global {
|
|
90
|
+
type Entries<T> = {
|
|
91
|
+
[K in keyof T]: [K, T[K]];
|
|
92
|
+
}[keyof T][];
|
|
93
|
+
|
|
94
|
+
interface ObjectConstructor {
|
|
95
|
+
entries<T extends object>(o: T): Entries<T>;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
89
99
|
export default class Inibase {
|
|
90
100
|
public database: string;
|
|
91
101
|
public databasePath: string;
|
|
@@ -563,7 +573,7 @@ export default class Inibase {
|
|
|
563
573
|
(data as Data[]).map((single_data) => CombineData(single_data))
|
|
564
574
|
);
|
|
565
575
|
else {
|
|
566
|
-
for (const [key, value] of Object.entries(data)) {
|
|
576
|
+
for (const [key, value] of Object.entries(data as Data)) {
|
|
567
577
|
if (Utils.isObject(value))
|
|
568
578
|
Object.assign(RETURN, CombineData(value, `${key}.`));
|
|
569
579
|
else if (Array.isArray(value)) {
|
|
@@ -809,7 +819,7 @@ export default class Inibase {
|
|
|
809
819
|
)) ?? {}
|
|
810
820
|
);
|
|
811
821
|
if (RETURN.length && !Array.isArray(where)) RETURN = RETURN[0];
|
|
812
|
-
} else if (
|
|
822
|
+
} else if (Utils.isObject(where)) {
|
|
813
823
|
// Criteria
|
|
814
824
|
const FormatObjectCriteriaValue = (
|
|
815
825
|
value: string
|
|
@@ -856,11 +866,14 @@ export default class Inibase {
|
|
|
856
866
|
const applyCriteria = async (
|
|
857
867
|
criteria?: Criteria,
|
|
858
868
|
allTrue?: boolean
|
|
859
|
-
): Promise<Data | null> => {
|
|
860
|
-
let RETURN: Data = {};
|
|
869
|
+
): Promise<Record<number, Data> | null> => {
|
|
870
|
+
let RETURN: Record<number, Data> = {};
|
|
861
871
|
if (!criteria) return null;
|
|
862
|
-
if (criteria.and &&
|
|
863
|
-
const searchResult = await applyCriteria(
|
|
872
|
+
if (criteria.and && Utils.isObject(criteria.and)) {
|
|
873
|
+
const searchResult = await applyCriteria(
|
|
874
|
+
criteria.and as Criteria,
|
|
875
|
+
true
|
|
876
|
+
);
|
|
864
877
|
if (searchResult) {
|
|
865
878
|
RETURN = Utils.deepMerge(
|
|
866
879
|
RETURN,
|
|
@@ -876,108 +889,112 @@ export default class Inibase {
|
|
|
876
889
|
} else return null;
|
|
877
890
|
}
|
|
878
891
|
|
|
879
|
-
if (criteria.or &&
|
|
880
|
-
const searchResult = await applyCriteria(criteria.or);
|
|
892
|
+
if (criteria.or && Utils.isObject(criteria.or)) {
|
|
893
|
+
const searchResult = await applyCriteria(criteria.or as Criteria);
|
|
881
894
|
delete criteria.or;
|
|
882
895
|
if (searchResult) RETURN = Utils.deepMerge(RETURN, searchResult);
|
|
883
896
|
}
|
|
884
897
|
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
index
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
if (typeof value === "object") {
|
|
910
|
-
if (value?.or && Array.isArray(value.or)) {
|
|
911
|
-
const searchCriteria = value.or
|
|
912
|
-
.map(
|
|
913
|
-
(
|
|
914
|
-
single_or
|
|
915
|
-
): [ComparisonOperator, string | number | boolean | null] =>
|
|
916
|
-
typeof single_or === "string"
|
|
917
|
-
? FormatObjectCriteriaValue(single_or)
|
|
918
|
-
: ["=", single_or]
|
|
898
|
+
if (Object.keys(criteria).length > 0) {
|
|
899
|
+
allTrue = true;
|
|
900
|
+
let index = -1;
|
|
901
|
+
for (const [key, value] of Object.entries(criteria)) {
|
|
902
|
+
index++;
|
|
903
|
+
let searchOperator:
|
|
904
|
+
| ComparisonOperator
|
|
905
|
+
| ComparisonOperator[]
|
|
906
|
+
| undefined = undefined,
|
|
907
|
+
searchComparedAtValue:
|
|
908
|
+
| string
|
|
909
|
+
| number
|
|
910
|
+
| boolean
|
|
911
|
+
| null
|
|
912
|
+
| (string | number | boolean | null)[]
|
|
913
|
+
| undefined = undefined,
|
|
914
|
+
searchLogicalOperator: "and" | "or" | undefined = undefined;
|
|
915
|
+
if (Utils.isObject(value)) {
|
|
916
|
+
if (
|
|
917
|
+
(value as Criteria)?.or &&
|
|
918
|
+
Array.isArray((value as Criteria).or)
|
|
919
|
+
) {
|
|
920
|
+
const searchCriteria = (
|
|
921
|
+
(value as Criteria).or as (string | number | boolean)[]
|
|
919
922
|
)
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
923
|
+
.map(
|
|
924
|
+
(
|
|
925
|
+
single_or
|
|
926
|
+
): [ComparisonOperator, string | number | boolean | null] =>
|
|
927
|
+
typeof single_or === "string"
|
|
928
|
+
? FormatObjectCriteriaValue(single_or)
|
|
929
|
+
: ["=", single_or]
|
|
930
|
+
)
|
|
931
|
+
.filter((a) => a) as [ComparisonOperator, string | number][];
|
|
932
|
+
if (searchCriteria.length > 0) {
|
|
933
|
+
searchOperator = searchCriteria.map(
|
|
934
|
+
(single_or) => single_or[0]
|
|
935
|
+
);
|
|
936
|
+
searchComparedAtValue = searchCriteria.map(
|
|
937
|
+
(single_or) => single_or[1]
|
|
938
|
+
);
|
|
939
|
+
searchLogicalOperator = "or";
|
|
940
|
+
}
|
|
941
|
+
delete (value as Criteria).or;
|
|
929
942
|
}
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
943
|
+
if (
|
|
944
|
+
(value as Criteria)?.and &&
|
|
945
|
+
Array.isArray((value as Criteria).and)
|
|
946
|
+
) {
|
|
947
|
+
const searchCriteria = (
|
|
948
|
+
(value as Criteria).and as (string | number | boolean)[]
|
|
949
|
+
)
|
|
950
|
+
.map(
|
|
951
|
+
(
|
|
952
|
+
single_and
|
|
953
|
+
): [ComparisonOperator, string | number | boolean | null] =>
|
|
954
|
+
typeof single_and === "string"
|
|
955
|
+
? FormatObjectCriteriaValue(single_and)
|
|
956
|
+
: ["=", single_and]
|
|
957
|
+
)
|
|
958
|
+
.filter((a) => a) as [ComparisonOperator, string | number][];
|
|
959
|
+
if (searchCriteria.length > 0) {
|
|
960
|
+
searchOperator = searchCriteria.map(
|
|
961
|
+
(single_and) => single_and[0]
|
|
962
|
+
);
|
|
963
|
+
searchComparedAtValue = searchCriteria.map(
|
|
964
|
+
(single_and) => single_and[1]
|
|
965
|
+
);
|
|
966
|
+
searchLogicalOperator = "and";
|
|
967
|
+
}
|
|
968
|
+
delete (value as Criteria).and;
|
|
969
|
+
}
|
|
970
|
+
} else if (Array.isArray(value)) {
|
|
971
|
+
const searchCriteria = value
|
|
934
972
|
.map(
|
|
935
973
|
(
|
|
936
|
-
|
|
974
|
+
single
|
|
937
975
|
): [ComparisonOperator, string | number | boolean | null] =>
|
|
938
|
-
typeof
|
|
939
|
-
? FormatObjectCriteriaValue(
|
|
940
|
-
: ["=",
|
|
976
|
+
typeof single === "string"
|
|
977
|
+
? FormatObjectCriteriaValue(single)
|
|
978
|
+
: ["=", single]
|
|
941
979
|
)
|
|
942
980
|
.filter((a) => a) as [ComparisonOperator, string | number][];
|
|
943
981
|
if (searchCriteria.length > 0) {
|
|
944
|
-
searchOperator = searchCriteria.map(
|
|
945
|
-
(single_and) => single_and[0]
|
|
946
|
-
);
|
|
982
|
+
searchOperator = searchCriteria.map((single) => single[0]);
|
|
947
983
|
searchComparedAtValue = searchCriteria.map(
|
|
948
|
-
(
|
|
984
|
+
(single) => single[1]
|
|
949
985
|
);
|
|
950
986
|
searchLogicalOperator = "and";
|
|
951
987
|
}
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
? FormatObjectCriteriaValue(single)
|
|
962
|
-
: ["=", single]
|
|
963
|
-
)
|
|
964
|
-
.filter((a) => a) as [ComparisonOperator, string | number][];
|
|
965
|
-
if (searchCriteria.length > 0) {
|
|
966
|
-
searchOperator = searchCriteria.map((single) => single[0]);
|
|
967
|
-
searchComparedAtValue = searchCriteria.map((single) => single[1]);
|
|
968
|
-
searchLogicalOperator = "and";
|
|
969
|
-
}
|
|
970
|
-
} else if (typeof value === "string") {
|
|
971
|
-
const ComparisonOperatorValue = FormatObjectCriteriaValue(value);
|
|
972
|
-
if (ComparisonOperatorValue) {
|
|
973
|
-
searchOperator = ComparisonOperatorValue[0];
|
|
974
|
-
searchComparedAtValue = ComparisonOperatorValue[1];
|
|
988
|
+
} else if (typeof value === "string") {
|
|
989
|
+
const ComparisonOperatorValue = FormatObjectCriteriaValue(value);
|
|
990
|
+
if (ComparisonOperatorValue) {
|
|
991
|
+
searchOperator = ComparisonOperatorValue[0];
|
|
992
|
+
searchComparedAtValue = ComparisonOperatorValue[1];
|
|
993
|
+
}
|
|
994
|
+
} else {
|
|
995
|
+
searchOperator = "=";
|
|
996
|
+
searchComparedAtValue = value as number | boolean;
|
|
975
997
|
}
|
|
976
|
-
} else {
|
|
977
|
-
searchOperator = "=";
|
|
978
|
-
searchComparedAtValue = value;
|
|
979
|
-
}
|
|
980
|
-
if (searchOperator && searchComparedAtValue) {
|
|
981
998
|
const [searchResult, totlaItems] = await File.search(
|
|
982
999
|
join(
|
|
983
1000
|
this.databasePath,
|
|
@@ -997,12 +1014,20 @@ export default class Inibase {
|
|
|
997
1014
|
if (!this.pageInfoArray[key]) this.pageInfoArray[key] = {};
|
|
998
1015
|
this.pageInfoArray[key].total_items = totlaItems;
|
|
999
1016
|
}
|
|
1017
|
+
if (allTrue && index > 0) {
|
|
1018
|
+
if (!Object.keys(RETURN).length) RETURN = {};
|
|
1019
|
+
RETURN = Object.fromEntries(
|
|
1020
|
+
Object.entries(RETURN).filter(
|
|
1021
|
+
([_index, item]) => Object.keys(item).length > index
|
|
1022
|
+
)
|
|
1023
|
+
);
|
|
1024
|
+
if (!Object.keys(RETURN).length) RETURN = {};
|
|
1025
|
+
}
|
|
1000
1026
|
}
|
|
1001
1027
|
}
|
|
1002
|
-
return Object.keys(RETURN).length
|
|
1028
|
+
return Object.keys(RETURN).length ? RETURN : null;
|
|
1003
1029
|
};
|
|
1004
|
-
|
|
1005
|
-
RETURN = await applyCriteria(where);
|
|
1030
|
+
RETURN = await applyCriteria(where as Criteria);
|
|
1006
1031
|
if (RETURN) {
|
|
1007
1032
|
if (onlyLinesNumbers) return Object.keys(RETURN).map(Number);
|
|
1008
1033
|
const alreadyExistsColumns = Object.keys(Object.values(RETURN)[0]).map(
|
|
@@ -1040,17 +1065,21 @@ export default class Inibase {
|
|
|
1040
1065
|
);
|
|
1041
1066
|
}
|
|
1042
1067
|
}
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
|
|
1048
|
-
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1068
|
+
if (
|
|
1069
|
+
!RETURN ||
|
|
1070
|
+
(Utils.isObject(RETURN) && !Object.keys(RETURN).length) ||
|
|
1071
|
+
(Array.isArray(RETURN) && !RETURN.length)
|
|
1072
|
+
)
|
|
1073
|
+
return null;
|
|
1074
|
+
return Utils.isArrayOfObjects(RETURN)
|
|
1075
|
+
? (RETURN as Data[]).map((data: Data) => {
|
|
1076
|
+
data.id = this.encodeID(data.id as number);
|
|
1077
|
+
return data;
|
|
1078
|
+
})
|
|
1079
|
+
: {
|
|
1080
|
+
...(RETURN as Data),
|
|
1081
|
+
id: this.encodeID((RETURN as Data).id as number),
|
|
1082
|
+
};
|
|
1054
1083
|
}
|
|
1055
1084
|
|
|
1056
1085
|
public async post(
|