@wxn0brp/db 0.0.4 → 0.0.6

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 (226) hide show
  1. package/README.md +3 -0
  2. package/dist/cjs/CollectionManager.d.ts +43 -0
  3. package/dist/cjs/CollectionManager.js +59 -0
  4. package/dist/cjs/action.d.ts +71 -0
  5. package/dist/cjs/action.js +199 -0
  6. package/dist/cjs/database.d.ts +77 -0
  7. package/dist/cjs/database.js +118 -0
  8. package/dist/cjs/executor.d.ts +28 -0
  9. package/{executor.js → dist/cjs/executor.js} +47 -54
  10. package/dist/cjs/file/find.d.ts +11 -0
  11. package/dist/cjs/file/find.js +80 -0
  12. package/dist/cjs/file/index.d.ts +3 -0
  13. package/dist/cjs/file/index.js +25 -0
  14. package/dist/cjs/file/remove.d.ts +7 -0
  15. package/dist/cjs/file/remove.js +61 -0
  16. package/dist/cjs/file/update.d.ts +7 -0
  17. package/dist/cjs/file/update.js +68 -0
  18. package/dist/cjs/file/utils.d.ts +8 -0
  19. package/dist/cjs/file/utils.js +23 -0
  20. package/dist/cjs/format.d.ts +18 -0
  21. package/dist/cjs/format.js +36 -0
  22. package/dist/cjs/gen.d.ts +5 -0
  23. package/dist/cjs/gen.js +78 -0
  24. package/dist/cjs/graph.d.ts +47 -0
  25. package/dist/cjs/graph.js +90 -0
  26. package/{index.d.ts → dist/cjs/index.d.ts} +2 -2
  27. package/dist/cjs/index.js +18 -0
  28. package/dist/cjs/relation.d.ts +64 -0
  29. package/{relation.js → dist/cjs/relation.js} +26 -45
  30. package/dist/cjs/remote/client/database.d.ts +71 -0
  31. package/dist/cjs/remote/client/database.js +145 -0
  32. package/dist/cjs/remote/client/function.d.ts +5 -0
  33. package/dist/cjs/remote/client/function.js +32 -0
  34. package/dist/cjs/remote/client/graph.d.ts +54 -0
  35. package/dist/cjs/remote/client/graph.js +93 -0
  36. package/dist/cjs/remote/client/remote.d.ts +16 -0
  37. package/dist/cjs/remote/client/remote.js +2 -0
  38. package/dist/cjs/remote/server/auth.d.ts +31 -0
  39. package/dist/cjs/remote/server/auth.js +99 -0
  40. package/dist/cjs/remote/server/db.d.ts +2 -0
  41. package/dist/cjs/remote/server/db.js +223 -0
  42. package/dist/cjs/remote/server/function.d.ts +2 -0
  43. package/dist/cjs/remote/server/function.js +89 -0
  44. package/dist/cjs/remote/server/graph.d.ts +2 -0
  45. package/dist/cjs/remote/server/graph.js +145 -0
  46. package/dist/cjs/remote/server/index.d.ts +1 -0
  47. package/dist/cjs/remote/server/index.js +66 -0
  48. package/dist/cjs/remote/server/initDataBases.d.ts +1 -0
  49. package/dist/cjs/remote/server/initDataBases.js +25 -0
  50. package/dist/cjs/remote/server/pathUtils.d.ts +1 -0
  51. package/dist/cjs/remote/server/pathUtils.js +12 -0
  52. package/dist/cjs/remote/server/secret.d.ts +1 -0
  53. package/dist/cjs/remote/server/secret.js +25 -0
  54. package/dist/cjs/remote/serverMgmt/index.d.ts +1 -0
  55. package/dist/cjs/remote/serverMgmt/index.js +87 -0
  56. package/dist/cjs/types/Id.d.ts +3 -0
  57. package/dist/cjs/types/Id.js +2 -0
  58. package/dist/cjs/types/arg.d.ts +6 -0
  59. package/dist/cjs/types/arg.js +2 -0
  60. package/dist/cjs/types/data.d.ts +4 -0
  61. package/dist/cjs/types/data.js +2 -0
  62. package/dist/cjs/types/options.d.ts +12 -0
  63. package/dist/cjs/types/options.js +2 -0
  64. package/dist/cjs/types/searchOpts.d.ts +61 -0
  65. package/dist/cjs/types/searchOpts.js +8 -0
  66. package/dist/cjs/types/types.d.ts +6 -0
  67. package/dist/cjs/types/types.js +2 -0
  68. package/dist/cjs/utils/hasFields.d.ts +8 -0
  69. package/dist/cjs/utils/hasFields.js +22 -0
  70. package/dist/cjs/utils/hasFieldsAdvanced.d.ts +5 -0
  71. package/dist/cjs/utils/hasFieldsAdvanced.js +182 -0
  72. package/dist/cjs/utils/updateFindObject.d.ts +11 -0
  73. package/dist/cjs/utils/updateFindObject.js +32 -0
  74. package/dist/cjs/utils/updateObject.d.ts +8 -0
  75. package/dist/cjs/utils/updateObject.js +18 -0
  76. package/dist/esm/CollectionManager.d.ts +43 -0
  77. package/dist/esm/CollectionManager.js +57 -0
  78. package/dist/esm/action.d.ts +71 -0
  79. package/dist/esm/action.js +194 -0
  80. package/dist/esm/database.d.ts +77 -0
  81. package/dist/esm/database.js +113 -0
  82. package/dist/esm/executor.d.ts +28 -0
  83. package/dist/esm/executor.js +45 -0
  84. package/dist/esm/file/find.d.ts +11 -0
  85. package/dist/esm/file/find.js +73 -0
  86. package/dist/esm/file/index.d.ts +3 -0
  87. package/{file → dist/esm/file}/index.js +1 -1
  88. package/dist/esm/file/remove.d.ts +7 -0
  89. package/dist/esm/file/remove.js +56 -0
  90. package/dist/esm/file/update.d.ts +7 -0
  91. package/dist/esm/file/update.js +63 -0
  92. package/dist/esm/file/utils.d.ts +8 -0
  93. package/{file → dist/esm/file}/utils.js +3 -11
  94. package/dist/esm/format.d.ts +18 -0
  95. package/{format.js → dist/esm/format.js} +29 -29
  96. package/dist/esm/gen.d.ts +5 -0
  97. package/dist/esm/gen.js +75 -0
  98. package/dist/esm/graph.d.ts +47 -0
  99. package/dist/esm/graph.js +85 -0
  100. package/dist/esm/index.d.ts +7 -0
  101. package/{index.js → dist/esm/index.js} +1 -9
  102. package/dist/esm/relation.d.ts +64 -0
  103. package/dist/esm/relation.js +65 -0
  104. package/dist/esm/remote/client/database.d.ts +71 -0
  105. package/dist/esm/remote/client/database.js +140 -0
  106. package/dist/esm/remote/client/function.d.ts +5 -0
  107. package/dist/esm/remote/client/function.js +30 -0
  108. package/dist/esm/remote/client/graph.d.ts +54 -0
  109. package/dist/esm/remote/client/graph.js +88 -0
  110. package/dist/esm/remote/client/remote.d.ts +16 -0
  111. package/dist/esm/remote/client/remote.js +1 -0
  112. package/dist/esm/remote/server/auth.d.ts +31 -0
  113. package/{remote → dist/esm/remote}/server/auth.js +31 -44
  114. package/dist/esm/remote/server/db.d.ts +2 -0
  115. package/dist/esm/remote/server/db.js +218 -0
  116. package/dist/esm/remote/server/function.d.ts +2 -0
  117. package/dist/esm/remote/server/function.js +87 -0
  118. package/dist/esm/remote/server/graph.d.ts +2 -0
  119. package/{remote → dist/esm/remote}/server/graph.js +62 -55
  120. package/dist/esm/remote/server/gui/css/main.css +130 -0
  121. package/dist/esm/remote/server/gui/css/scrool.css +81 -0
  122. package/dist/esm/remote/server/gui/css/style.css +61 -0
  123. package/dist/esm/remote/server/gui/favicon.svg +12 -0
  124. package/dist/esm/remote/server/gui/html/data.html +15 -0
  125. package/dist/esm/remote/server/gui/html/main.html +46 -0
  126. package/dist/esm/remote/server/gui/html/nav.html +25 -0
  127. package/dist/esm/remote/server/gui/html/popup.html +51 -0
  128. package/dist/esm/remote/server/gui/index.html +49 -0
  129. package/dist/esm/remote/server/gui/js/api.js +166 -0
  130. package/dist/esm/remote/server/gui/js/index.js +17 -0
  131. package/dist/esm/remote/server/gui/js/loadHTML.js +16 -0
  132. package/dist/esm/remote/server/gui/js/popUp.js +72 -0
  133. package/dist/esm/remote/server/gui/js/queryApi.js +51 -0
  134. package/dist/esm/remote/server/gui/js/queryDb.js +79 -0
  135. package/dist/esm/remote/server/gui/js/queryGraph.js +144 -0
  136. package/dist/esm/remote/server/gui/js/render.js +64 -0
  137. package/dist/esm/remote/server/gui/js/templates.js +31 -0
  138. package/dist/esm/remote/server/gui/js/utils.js +36 -0
  139. package/dist/esm/remote/server/gui/js/vars.js +9 -0
  140. package/dist/esm/remote/server/gui/libs/core.js +176 -0
  141. package/dist/esm/remote/server/gui/libs/d3.v7.min.js +2 -0
  142. package/dist/esm/remote/server/gui/libs/handlebars.min.js +29 -0
  143. package/dist/esm/remote/server/gui/libs/json5.min.js +1 -0
  144. package/dist/esm/remote/server/index.d.ts +1 -0
  145. package/dist/esm/remote/server/index.js +61 -0
  146. package/dist/esm/remote/server/initDataBases.d.ts +1 -0
  147. package/dist/esm/remote/server/initDataBases.js +20 -0
  148. package/dist/esm/remote/server/pathUtils.d.ts +1 -0
  149. package/{remote → dist/esm/remote}/server/pathUtils.js +2 -3
  150. package/dist/esm/remote/server/secret.d.ts +1 -0
  151. package/{remote → dist/esm/remote}/server/secret.js +3 -7
  152. package/dist/esm/remote/serverMgmt/index.d.ts +1 -0
  153. package/{remote → dist/esm/remote}/serverMgmt/index.js +27 -31
  154. package/dist/esm/types/Id.d.ts +3 -0
  155. package/dist/esm/types/Id.js +1 -0
  156. package/dist/esm/types/arg.d.ts +6 -0
  157. package/dist/esm/types/arg.js +1 -0
  158. package/dist/esm/types/data.d.ts +4 -0
  159. package/dist/esm/types/data.js +1 -0
  160. package/dist/esm/types/options.d.ts +12 -0
  161. package/dist/esm/types/options.js +1 -0
  162. package/dist/esm/types/searchOpts.d.ts +61 -0
  163. package/dist/esm/types/searchOpts.js +7 -0
  164. package/dist/esm/types/types.d.ts +6 -0
  165. package/dist/esm/types/types.js +1 -0
  166. package/dist/esm/utils/hasFields.d.ts +8 -0
  167. package/{utils → dist/esm/utils}/hasFields.js +4 -4
  168. package/dist/esm/utils/hasFieldsAdvanced.d.ts +5 -0
  169. package/dist/esm/utils/hasFieldsAdvanced.js +176 -0
  170. package/dist/esm/utils/updateFindObject.d.ts +11 -0
  171. package/{utils → dist/esm/utils}/updateFindObject.js +11 -16
  172. package/dist/esm/utils/updateObject.d.ts +8 -0
  173. package/{utils → dist/esm/utils}/updateObject.js +4 -4
  174. package/package.json +55 -36
  175. package/CollectionManager.js +0 -119
  176. package/action.js +0 -258
  177. package/database.d.ts +0 -44
  178. package/database.js +0 -203
  179. package/docs/database.md +0 -140
  180. package/docs/graph.md +0 -86
  181. package/docs/relation.md +0 -51
  182. package/docs/remote.md +0 -30
  183. package/docs/remote_server.md +0 -35
  184. package/docs/search_opts.md +0 -227
  185. package/file/find.js +0 -89
  186. package/file/remove.js +0 -74
  187. package/file/update.js +0 -83
  188. package/gen.d.ts +0 -1
  189. package/gen.js +0 -97
  190. package/graph.d.ts +0 -27
  191. package/graph.js +0 -140
  192. package/relation.d.ts +0 -23
  193. package/remote/client/database.d.ts +0 -41
  194. package/remote/client/database.js +0 -228
  195. package/remote/client/graph.d.ts +0 -31
  196. package/remote/client/graph.js +0 -148
  197. package/remote/server/db.js +0 -197
  198. package/remote/server/function.js +0 -43
  199. package/remote/server/index.js +0 -63
  200. package/remote/server/initDataBases.js +0 -20
  201. package/test/hasFieldsAdvanced.test.js +0 -70
  202. package/utils/hasFieldsAdvanced.js +0 -184
  203. /package/{remote → dist/cjs/remote}/server/gui/css/main.css +0 -0
  204. /package/{remote → dist/cjs/remote}/server/gui/css/scrool.css +0 -0
  205. /package/{remote → dist/cjs/remote}/server/gui/css/style.css +0 -0
  206. /package/{remote → dist/cjs/remote}/server/gui/favicon.svg +0 -0
  207. /package/{remote → dist/cjs/remote}/server/gui/html/data.html +0 -0
  208. /package/{remote → dist/cjs/remote}/server/gui/html/main.html +0 -0
  209. /package/{remote → dist/cjs/remote}/server/gui/html/nav.html +0 -0
  210. /package/{remote → dist/cjs/remote}/server/gui/html/popup.html +0 -0
  211. /package/{remote → dist/cjs/remote}/server/gui/index.html +0 -0
  212. /package/{remote → dist/cjs/remote}/server/gui/js/api.js +0 -0
  213. /package/{remote → dist/cjs/remote}/server/gui/js/index.js +0 -0
  214. /package/{remote → dist/cjs/remote}/server/gui/js/loadHTML.js +0 -0
  215. /package/{remote → dist/cjs/remote}/server/gui/js/popUp.js +0 -0
  216. /package/{remote → dist/cjs/remote}/server/gui/js/queryApi.js +0 -0
  217. /package/{remote → dist/cjs/remote}/server/gui/js/queryDb.js +0 -0
  218. /package/{remote → dist/cjs/remote}/server/gui/js/queryGraph.js +0 -0
  219. /package/{remote → dist/cjs/remote}/server/gui/js/render.js +0 -0
  220. /package/{remote → dist/cjs/remote}/server/gui/js/templates.js +0 -0
  221. /package/{remote → dist/cjs/remote}/server/gui/js/utils.js +0 -0
  222. /package/{remote → dist/cjs/remote}/server/gui/js/vars.js +0 -0
  223. /package/{remote → dist/cjs/remote}/server/gui/libs/core.js +0 -0
  224. /package/{remote → dist/cjs/remote}/server/gui/libs/d3.v7.min.js +0 -0
  225. /package/{remote → dist/cjs/remote}/server/gui/libs/handlebars.min.js +0 -0
  226. /package/{remote → dist/cjs/remote}/server/gui/libs/json5.min.js +0 -0
@@ -0,0 +1,182 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.default = hasFieldsAdvanced;
7
+ const hasFields_js_1 = __importDefault(require("./hasFields.js"));
8
+ /**
9
+ * Checks if an object meets the criteria specified in the fields with operators.
10
+ */
11
+ function hasFieldsAdvanced(obj, fields) {
12
+ if (typeof fields !== "object" || fields === null) {
13
+ throw new Error("Fields must be an object");
14
+ }
15
+ if ("$and" in fields) {
16
+ return fields["$and"].every(subFields => hasFieldsAdvanced(obj, subFields));
17
+ }
18
+ if ("$or" in fields) {
19
+ return fields["$or"].some(subFields => hasFieldsAdvanced(obj, subFields));
20
+ }
21
+ // Check various conditions
22
+ if (!checkConditions(obj, fields))
23
+ return false;
24
+ const fieldsSubset = removeAdvancedOperators({ ...fields });
25
+ return (0, hasFields_js_1.default)(obj, fieldsSubset);
26
+ }
27
+ function removeAdvancedOperators(fields) {
28
+ const advancedOperators = [
29
+ "and", "or",
30
+ "gt", "lt", "gte", "lte", "in", "nin",
31
+ "exists",
32
+ "type",
33
+ "regex",
34
+ "arrinc", "arrincall", "size",
35
+ "startsWith", "endsWith",
36
+ "between",
37
+ "not",
38
+ "subset"
39
+ ].map(operator => "$" + operator);
40
+ advancedOperators.forEach(operator => delete fields[operator]);
41
+ return fields;
42
+ }
43
+ function checkConditions(obj, fields) {
44
+ return (checkComparison(obj, fields) &&
45
+ checkExistence(obj, fields) &&
46
+ checkType(obj, fields) &&
47
+ checkRegex(obj, fields) &&
48
+ checkArrayConditions(obj, fields) &&
49
+ checkStringConditions(obj, fields) &&
50
+ checkBetween(obj, fields) &&
51
+ checkNot(obj, fields) &&
52
+ checkSubset(obj, fields));
53
+ }
54
+ function checkComparison(obj, fields) {
55
+ const comparisonOperators = ["$gt", "$lt", "$gte", "$lte", "$in", "$nin"];
56
+ for (const operator of comparisonOperators) {
57
+ if (operator in fields) {
58
+ for (const entries of Object.entries(fields[operator])) {
59
+ const [key, value] = entries;
60
+ switch (operator) {
61
+ case "$gt":
62
+ if (!(obj[key] > value))
63
+ return false;
64
+ break;
65
+ case "$lt":
66
+ if (!(obj[key] < value))
67
+ return false;
68
+ break;
69
+ case "$gte":
70
+ if (!(obj[key] >= value))
71
+ return false;
72
+ break;
73
+ case "$lte":
74
+ if (!(obj[key] <= value))
75
+ return false;
76
+ break;
77
+ case "$in":
78
+ if (!value.includes(obj[key]))
79
+ return false;
80
+ break;
81
+ case "$nin":
82
+ if (value.includes(obj[key]))
83
+ return false;
84
+ break;
85
+ }
86
+ }
87
+ }
88
+ }
89
+ return true;
90
+ }
91
+ function checkExistence(obj, fields) {
92
+ if ("$exists" in fields) {
93
+ for (const [key, shouldExist] of Object.entries(fields["$exists"])) {
94
+ if (shouldExist && !(key in obj))
95
+ return false;
96
+ if (!shouldExist && (key in obj))
97
+ return false;
98
+ }
99
+ }
100
+ return true;
101
+ }
102
+ function checkType(obj, fields) {
103
+ if ("$type" in fields) {
104
+ for (const [key, type] of Object.entries(fields["$type"])) {
105
+ if (typeof obj[key] !== type)
106
+ return false;
107
+ }
108
+ }
109
+ return true;
110
+ }
111
+ function checkRegex(obj, fields) {
112
+ if ("$regex" in fields) {
113
+ for (const [key, regex] of Object.entries(fields["$regex"])) {
114
+ if (!regex.test(obj[key]))
115
+ return false;
116
+ }
117
+ }
118
+ return true;
119
+ }
120
+ function checkArrayConditions(obj, fields) {
121
+ if ("$arrinc" in fields) {
122
+ for (const [key, values] of Object.entries(fields["$arrinc"])) {
123
+ if (!Array.isArray(obj[key]) || !values.some(val => obj[key].includes(val)))
124
+ return false;
125
+ }
126
+ }
127
+ if ("$arrincall" in fields) {
128
+ for (const [key, values] of Object.entries(fields["$arrincall"])) {
129
+ if (!Array.isArray(obj[key]) || !values.every(val => obj[key].includes(val)))
130
+ return false;
131
+ }
132
+ }
133
+ if ("$size" in fields) {
134
+ for (const [key, size] of Object.entries(fields["$size"])) {
135
+ if (Array.isArray(obj[key]) || typeof obj[key] === "string") {
136
+ if (obj[key].length !== size)
137
+ return false;
138
+ }
139
+ else {
140
+ return false;
141
+ }
142
+ }
143
+ }
144
+ return true;
145
+ }
146
+ function checkStringConditions(obj, fields) {
147
+ if ("$startsWith" in fields) {
148
+ for (const [key, value] of Object.entries(fields["$startsWith"])) {
149
+ if (typeof obj[key] !== "string" || !obj[key].startsWith(value))
150
+ return false;
151
+ }
152
+ }
153
+ if ("$endsWith" in fields) {
154
+ for (const [key, value] of Object.entries(fields["$endsWith"])) {
155
+ if (typeof obj[key] !== "string" || !obj[key].endsWith(value))
156
+ return false;
157
+ }
158
+ }
159
+ return true;
160
+ }
161
+ function checkBetween(obj, fields) {
162
+ if ("$between" in fields) {
163
+ for (const [key, [min, max]] of Object.entries(fields["$between"])) {
164
+ if (typeof obj[key] !== "number" || obj[key] < min || obj[key] > max)
165
+ return false;
166
+ }
167
+ }
168
+ return true;
169
+ }
170
+ function checkNot(obj, fields) {
171
+ if ("$not" in fields) {
172
+ return !hasFieldsAdvanced(obj, fields["$not"]);
173
+ }
174
+ return true;
175
+ }
176
+ function checkSubset(obj, fields) {
177
+ if ("$subset" in fields) {
178
+ const setFields = fields["$subset"];
179
+ return (0, hasFields_js_1.default)(obj, setFields);
180
+ }
181
+ return true;
182
+ }
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Updates an object with new values from a findOpts object.
3
+ * @function
4
+ * @param {Object} obj - The object to update.
5
+ * @param {Object} findOpts - An object containing options to update the target object.
6
+ * @param {function} [findOpts.transform] - A function to transform the object before applying the other options.
7
+ * @param {string[]} [findOpts.select] - An array of fields to select from the target object.
8
+ * @param {string[]} [findOpts.exclude] - An array of fields to exclude from the target object.
9
+ * @returns {Object} The updated object.
10
+ */
11
+ export default function updateFindObject(obj: any, findOpts: any): any;
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = updateFindObject;
4
+ /**
5
+ * Updates an object with new values from a findOpts object.
6
+ * @function
7
+ * @param {Object} obj - The object to update.
8
+ * @param {Object} findOpts - An object containing options to update the target object.
9
+ * @param {function} [findOpts.transform] - A function to transform the object before applying the other options.
10
+ * @param {string[]} [findOpts.select] - An array of fields to select from the target object.
11
+ * @param {string[]} [findOpts.exclude] - An array of fields to exclude from the target object.
12
+ * @returns {Object} The updated object.
13
+ */
14
+ function updateFindObject(obj, findOpts) {
15
+ const { transform, select, exclude, } = findOpts;
16
+ if (typeof transform === "function")
17
+ obj = transform(obj);
18
+ if (Array.isArray(exclude)) {
19
+ exclude.forEach(field => {
20
+ if (obj.hasOwnProperty(field))
21
+ delete obj[field];
22
+ });
23
+ }
24
+ if (Array.isArray(select)) {
25
+ obj = select.reduce((acc, field) => {
26
+ if (obj.hasOwnProperty(field))
27
+ acc[field] = obj[field];
28
+ return acc;
29
+ }, {});
30
+ }
31
+ return obj;
32
+ }
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Updates an object with new values.
3
+ * @function
4
+ * @param {Object} obj - The object to update.
5
+ * @param {Object} newVal - An object containing new values to update in the target object.
6
+ * @returns {Object} The updated object.
7
+ */
8
+ export default function updateObject(obj: any, newVal: any): any;
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = updateObject;
4
+ /**
5
+ * Updates an object with new values.
6
+ * @function
7
+ * @param {Object} obj - The object to update.
8
+ * @param {Object} newVal - An object containing new values to update in the target object.
9
+ * @returns {Object} The updated object.
10
+ */
11
+ function updateObject(obj, newVal) {
12
+ for (let key in newVal) {
13
+ if (newVal.hasOwnProperty(key)) {
14
+ obj[key] = newVal[key];
15
+ }
16
+ }
17
+ return obj;
18
+ }
@@ -0,0 +1,43 @@
1
+ import DataBase from "./database.js";
2
+ import DataBaseRemote from "./remote/client/database.js";
3
+ import { Arg, ArgOrFunc } from "./types/arg.js";
4
+ import { DbFindOpts, FindOpts } from "./types/options.js";
5
+ import { Context } from "./types/types.js";
6
+ declare class CollectionManager {
7
+ db: DataBase | DataBaseRemote;
8
+ collection: string;
9
+ constructor(db: DataBase | DataBaseRemote, collection: string);
10
+ /**
11
+ * Add data to a database.
12
+ */
13
+ add(data: Arg, id_gen?: boolean): Promise<any>;
14
+ /**
15
+ * Find data in a database.
16
+ */
17
+ find(search: ArgOrFunc, context?: Context, options?: DbFindOpts, findOpts?: FindOpts): Promise<any>;
18
+ /**
19
+ * Find one data entry in a database.
20
+ */
21
+ findOne(search: ArgOrFunc, context?: Context, findOpts?: FindOpts): Promise<any>;
22
+ /**
23
+ * Update data in a database.
24
+ */
25
+ update(search: ArgOrFunc, arg: ArgOrFunc, context?: Context): Promise<any>;
26
+ /**
27
+ * Update one data entry in a database.
28
+ */
29
+ updateOne(search: ArgOrFunc, arg: ArgOrFunc, context?: Context): Promise<any>;
30
+ /**
31
+ * Remove data from a database.
32
+ */
33
+ remove(search: ArgOrFunc, context?: Context): Promise<any>;
34
+ /**
35
+ * Remove one data entry from a database.
36
+ */
37
+ removeOne(search: ArgOrFunc, context?: Context): Promise<any>;
38
+ /**
39
+ * Asynchronously updates one entry in a database or adds a new one if it doesn't exist.
40
+ */
41
+ updateOneOrAdd(search: ArgOrFunc, arg: ArgOrFunc, add_arg?: Arg, context?: Context, id_gen?: boolean): Promise<any>;
42
+ }
43
+ export default CollectionManager;
@@ -0,0 +1,57 @@
1
+ class CollectionManager {
2
+ db;
3
+ collection;
4
+ constructor(db, collection) {
5
+ this.db = db;
6
+ this.collection = collection;
7
+ }
8
+ /**
9
+ * Add data to a database.
10
+ */
11
+ async add(data, id_gen = true) {
12
+ return await this.db.add(this.collection, data, id_gen);
13
+ }
14
+ /**
15
+ * Find data in a database.
16
+ */
17
+ async find(search, context = {}, options = {}, findOpts = {}) {
18
+ return await this.db.find(this.collection, search, context, options, findOpts);
19
+ }
20
+ /**
21
+ * Find one data entry in a database.
22
+ */
23
+ async findOne(search, context = {}, findOpts = {}) {
24
+ return await this.db.findOne(this.collection, search, context, findOpts);
25
+ }
26
+ /**
27
+ * Update data in a database.
28
+ */
29
+ async update(search, arg, context = {}) {
30
+ return await this.db.update(this.collection, search, arg, context);
31
+ }
32
+ /**
33
+ * Update one data entry in a database.
34
+ */
35
+ async updateOne(search, arg, context = {}) {
36
+ return await this.db.updateOne(this.collection, search, arg, context);
37
+ }
38
+ /**
39
+ * Remove data from a database.
40
+ */
41
+ async remove(search, context = {}) {
42
+ return await this.db.remove(this.collection, search, context);
43
+ }
44
+ /**
45
+ * Remove one data entry from a database.
46
+ */
47
+ async removeOne(search, context = {}) {
48
+ return await this.db.removeOne(this.collection, search, context);
49
+ }
50
+ /**
51
+ * Asynchronously updates one entry in a database or adds a new one if it doesn't exist.
52
+ */
53
+ async updateOneOrAdd(search, arg, add_arg = {}, context = {}, id_gen = true) {
54
+ return await this.db.updateOneOrAdd(this.collection, search, arg, add_arg, context, id_gen);
55
+ }
56
+ }
57
+ export default CollectionManager;
@@ -0,0 +1,71 @@
1
+ import { Arg, ArgOrFunc } from "./types/arg.js";
2
+ import { DbFindOpts, DbOpts, FindOpts } from "./types/options.js";
3
+ import { Context } from "./types/types";
4
+ import Data from "./types/data.js";
5
+ /**
6
+ * A class representing database actions on files.
7
+ * @class
8
+ */
9
+ declare class dbActionC {
10
+ folder: string;
11
+ options: DbOpts;
12
+ /**
13
+ * Creates a new instance of dbActionC.
14
+ * @constructor
15
+ * @param {string} folder - The folder where database files are stored.
16
+ * @param {object} options - The options object.
17
+ */
18
+ constructor(folder: string, options: DbOpts);
19
+ _getCollectionPath(collection: string): string;
20
+ /**
21
+ * Get a list of available databases in the specified folder.
22
+ * @returns {string[]} An array of database names.
23
+ */
24
+ getCollections(): string[];
25
+ /**
26
+ * Check and create the specified collection if it doesn't exist.
27
+ * @function
28
+ * @param {string} collection - The collection to check.
29
+ */
30
+ checkCollection(collection: string): void;
31
+ /**
32
+ * Check if a collection exists.
33
+ * @function
34
+ * @param {string} collection - The name of the collection.
35
+ * @returns {boolean} True if the collection exists, false otherwise.
36
+ */
37
+ issetCollection(collection: string): boolean;
38
+ /**
39
+ * Add a new entry to the specified database.
40
+ */
41
+ add(collection: string, arg: Arg, id_gen?: boolean): Promise<Arg>;
42
+ /**
43
+ * Find entries in the specified database based on search criteria.
44
+ */
45
+ find(collection: string, arg: ArgOrFunc, context?: Context, options?: DbFindOpts, findOpts?: FindOpts): Promise<any[]>;
46
+ /**
47
+ * Find the first matching entry in the specified database based on search criteria.
48
+ */
49
+ findOne(collection: string, arg: ArgOrFunc, context?: Context, findOpts?: FindOpts): Promise<Data>;
50
+ /**
51
+ * Update entries in the specified database based on search criteria and an updater function or object.
52
+ */
53
+ update(collection: string, arg: ArgOrFunc, obj: ArgOrFunc, context?: {}): Promise<boolean>;
54
+ /**
55
+ * Update the first matching entry in the specified database based on search criteria and an updater function or object.
56
+ */
57
+ updateOne(collection: string, arg: ArgOrFunc, obj: ArgOrFunc, context?: Context): Promise<boolean>;
58
+ /**
59
+ * Remove entries from the specified database based on search criteria.
60
+ */
61
+ remove(collection: string, arg: ArgOrFunc, context?: Context): Promise<boolean>;
62
+ /**
63
+ * Remove the first matching entry from the specified database based on search criteria.
64
+ */
65
+ removeOne(collection: string, arg: ArgOrFunc, context?: Context): Promise<boolean>;
66
+ /**
67
+ * Removes a database collection from the file system.
68
+ */
69
+ removeCollection(collection: string): void;
70
+ }
71
+ export default dbActionC;
@@ -0,0 +1,194 @@
1
+ import { existsSync, mkdirSync, readdirSync, appendFileSync, rmSync, writeFileSync, statSync } from "fs";
2
+ import gen from "./gen.js";
3
+ import { stringify } from "./format.js";
4
+ import { find as _find, findOne as _findOne, update as _update, remove as _remove } from "./file/index.js";
5
+ /**
6
+ * A class representing database actions on files.
7
+ * @class
8
+ */
9
+ class dbActionC {
10
+ folder;
11
+ options;
12
+ /**
13
+ * Creates a new instance of dbActionC.
14
+ * @constructor
15
+ * @param {string} folder - The folder where database files are stored.
16
+ * @param {object} options - The options object.
17
+ */
18
+ constructor(folder, options) {
19
+ this.folder = folder;
20
+ this.options = {
21
+ maxFileSize: 2 * 1024 * 1024, //2 MB
22
+ ...options,
23
+ };
24
+ if (!existsSync(folder))
25
+ mkdirSync(folder, { recursive: true });
26
+ }
27
+ _getCollectionPath(collection) {
28
+ return this.folder + "/" + collection + "/";
29
+ }
30
+ /**
31
+ * Get a list of available databases in the specified folder.
32
+ * @returns {string[]} An array of database names.
33
+ */
34
+ getCollections() {
35
+ const collections = readdirSync(this.folder, { recursive: true, withFileTypes: true })
36
+ .filter(dirent => dirent.isDirectory())
37
+ .map(dirent => {
38
+ if (dirent.parentPath === this.folder)
39
+ return dirent.name;
40
+ return dirent.parentPath.replace(this.folder + "/", "") + "/" + dirent.name;
41
+ });
42
+ return collections;
43
+ }
44
+ /**
45
+ * Check and create the specified collection if it doesn't exist.
46
+ * @function
47
+ * @param {string} collection - The collection to check.
48
+ */
49
+ checkCollection(collection) {
50
+ const cpath = this._getCollectionPath(collection);
51
+ if (!existsSync(cpath))
52
+ mkdirSync(cpath, { recursive: true });
53
+ }
54
+ /**
55
+ * Check if a collection exists.
56
+ * @function
57
+ * @param {string} collection - The name of the collection.
58
+ * @returns {boolean} True if the collection exists, false otherwise.
59
+ */
60
+ issetCollection(collection) {
61
+ const path = this.folder + "/" + collection;
62
+ return existsSync(path);
63
+ }
64
+ /**
65
+ * Add a new entry to the specified database.
66
+ */
67
+ async add(collection, arg, id_gen = true) {
68
+ this.checkCollection(collection);
69
+ const cpath = this._getCollectionPath(collection);
70
+ const file = cpath + getLastFile(cpath, this.options.maxFileSize);
71
+ if (id_gen)
72
+ arg._id = arg._id || gen();
73
+ const data = stringify(arg);
74
+ appendFileSync(file, data + "\n");
75
+ return arg;
76
+ }
77
+ /**
78
+ * Find entries in the specified database based on search criteria.
79
+ */
80
+ async find(collection, arg, context = {}, options = {}, findOpts = {}) {
81
+ options.reverse = options.reverse || false;
82
+ options.max = options.max || -1;
83
+ this.checkCollection(collection);
84
+ const cpath = this._getCollectionPath(collection);
85
+ const files = getSortedFiles(cpath).map(f => f.f);
86
+ if (options.reverse)
87
+ files.reverse();
88
+ let datas = [];
89
+ let totalEntries = 0;
90
+ for (let f of files) {
91
+ let data = await _find(cpath + f, arg, context, findOpts);
92
+ if (options.reverse)
93
+ data.reverse();
94
+ if (options.max !== -1) {
95
+ if (totalEntries + data.length > options.max) {
96
+ let remainingEntries = options.max - totalEntries;
97
+ data = data.slice(0, remainingEntries);
98
+ totalEntries = options.max;
99
+ }
100
+ else {
101
+ totalEntries += data.length;
102
+ }
103
+ }
104
+ datas = datas.concat(data);
105
+ if (options.max !== -1 && totalEntries >= options.max)
106
+ break;
107
+ }
108
+ return datas;
109
+ }
110
+ /**
111
+ * Find the first matching entry in the specified database based on search criteria.
112
+ */
113
+ async findOne(collection, arg, context = {}, findOpts = {}) {
114
+ this.checkCollection(collection);
115
+ const cpath = this._getCollectionPath(collection);
116
+ const files = getSortedFiles(cpath).map(f => f.f);
117
+ for (let f of files) {
118
+ let data = await _findOne(cpath + f, arg, context, findOpts);
119
+ if (data)
120
+ return data;
121
+ }
122
+ return null;
123
+ }
124
+ /**
125
+ * Update entries in the specified database based on search criteria and an updater function or object.
126
+ */
127
+ async update(collection, arg, obj, context = {}) {
128
+ this.checkCollection(collection);
129
+ return await _update(this._getCollectionPath(collection), arg, obj, context);
130
+ }
131
+ /**
132
+ * Update the first matching entry in the specified database based on search criteria and an updater function or object.
133
+ */
134
+ async updateOne(collection, arg, obj, context = {}) {
135
+ this.checkCollection(collection);
136
+ return await _update(this._getCollectionPath(collection), arg, obj, context, true);
137
+ }
138
+ /**
139
+ * Remove entries from the specified database based on search criteria.
140
+ */
141
+ async remove(collection, arg, context = {}) {
142
+ this.checkCollection(collection);
143
+ return await _remove(this._getCollectionPath(collection), arg, context);
144
+ }
145
+ /**
146
+ * Remove the first matching entry from the specified database based on search criteria.
147
+ */
148
+ async removeOne(collection, arg, context = {}) {
149
+ this.checkCollection(collection);
150
+ return await _remove(this._getCollectionPath(collection), arg, context, true);
151
+ }
152
+ /**
153
+ * Removes a database collection from the file system.
154
+ */
155
+ removeCollection(collection) {
156
+ rmSync(this.folder + "/" + collection, { recursive: true, force: true });
157
+ }
158
+ }
159
+ /**
160
+ * Get the last file in the specified directory.
161
+ */
162
+ function getLastFile(path, maxFileSize = 1024 * 1024) {
163
+ if (!existsSync(path))
164
+ mkdirSync(path, { recursive: true });
165
+ const files = getSortedFiles(path);
166
+ if (files.length == 0) {
167
+ writeFileSync(path + "/1.db", "");
168
+ return "1.db";
169
+ }
170
+ const last = files[files.length - 1];
171
+ const info = path + "/" + last.f;
172
+ if (statSync(info).size < maxFileSize)
173
+ return last.f;
174
+ const num = last.i + 1;
175
+ writeFileSync(path + "/" + num + ".db", "");
176
+ return num + ".db";
177
+ }
178
+ /**
179
+ * Get all files in a directory sorted by name.
180
+ */
181
+ function getSortedFiles(path) {
182
+ const files = readdirSync(path).filter(file => file.endsWith(".db"));
183
+ if (files.length == 0)
184
+ return [];
185
+ const filesWithoutExt = files.map(file => parseInt(file.replace(".db", "")));
186
+ filesWithoutExt.sort();
187
+ return filesWithoutExt.map(file => {
188
+ return {
189
+ i: file,
190
+ f: file + ".db"
191
+ };
192
+ });
193
+ }
194
+ export default dbActionC;