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.
Files changed (4) hide show
  1. package/README.md +1 -1
  2. package/file.ts +19 -14
  3. package/index.ts +135 -106
  4. package/package.json +1 -1
package/README.md CHANGED
@@ -1,4 +1,4 @@
1
- ![Inibase banner](./.github/assets/banner.jpg)
1
+ [![Inibase banner](./.github/assets/banner.jpg)](https://github.com/inicontent/inibase)
2
2
 
3
3
  # Inibase :pencil:
4
4
 
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
- return fieldType === "password" &&
187
- typeof value === "string" &&
188
- typeof comparedAtValue === "string"
189
- ? Utils.comparePassword(value, comparedAtValue)
190
- : value === comparedAtValue;
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
- decodedLine &&
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
- (!Array.isArray(operator) &&
293
- handleComparisonOperator(
294
- operator,
295
- decodedLine,
296
- comparedAtValue,
297
- fieldType
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 (typeof where === "object" && !Array.isArray(where)) {
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 && typeof criteria.and === "object") {
863
- const searchResult = await applyCriteria(criteria.and, true);
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 && typeof criteria.or === "object") {
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
- let index = -1;
886
- for (const [key, value] of Object.entries(criteria)) {
887
- index++;
888
- if (
889
- allTrue &&
890
- index > 0 &&
891
- (!Object.keys(RETURN).length ||
892
- Object.values(RETURN).every(
893
- (item) => Object.keys(item).length >= index
894
- ))
895
- )
896
- break;
897
- let searchOperator:
898
- | ComparisonOperator
899
- | ComparisonOperator[]
900
- | undefined = undefined,
901
- searchComparedAtValue:
902
- | string
903
- | number
904
- | boolean
905
- | null
906
- | (string | number | boolean | null)[]
907
- | undefined = undefined,
908
- searchLogicalOperator: "and" | "or" | undefined = undefined;
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
- .filter((a) => a) as [ComparisonOperator, string | number][];
921
- if (searchCriteria.length > 0) {
922
- searchOperator = searchCriteria.map(
923
- (single_or) => single_or[0]
924
- );
925
- searchComparedAtValue = searchCriteria.map(
926
- (single_or) => single_or[1]
927
- );
928
- searchLogicalOperator = "or";
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
- delete value.or;
931
- }
932
- if (value?.and && Array.isArray(value.and)) {
933
- const searchCriteria = value.and
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
- single_and
974
+ single
937
975
  ): [ComparisonOperator, string | number | boolean | null] =>
938
- typeof single_and === "string"
939
- ? FormatObjectCriteriaValue(single_and)
940
- : ["=", single_and]
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
- (single_and) => single_and[1]
984
+ (single) => single[1]
949
985
  );
950
986
  searchLogicalOperator = "and";
951
987
  }
952
- delete value.and;
953
- }
954
- } else if (Array.isArray(value)) {
955
- const searchCriteria = value
956
- .map(
957
- (
958
- single
959
- ): [ComparisonOperator, string | number | boolean | null] =>
960
- typeof single === "string"
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 > 0 ? RETURN : null;
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
- return RETURN
1044
- ? Utils.isArrayOfObjects(RETURN)
1045
- ? (RETURN as Data[]).map((data: Data) => {
1046
- data.id = this.encodeID(data.id as number);
1047
- return data;
1048
- })
1049
- : {
1050
- ...(RETURN as Data),
1051
- id: this.encodeID((RETURN as Data).id as number),
1052
- }
1053
- : null;
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(
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "inibase",
3
- "version": "1.0.0-rc.3",
3
+ "version": "1.0.0-rc.4",
4
4
  "description": "File-based Relational Database for large data",
5
5
  "main": "index.ts",
6
6
  "repository": {