inibase 1.0.0-rc.23 → 1.0.0-rc.24

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/file.d.ts CHANGED
@@ -1,10 +1,10 @@
1
1
  /// <reference types="node" resolution-mode="require"/>
2
2
  import { ComparisonOperator, FieldType } from "./index.js";
3
3
  export declare const isExists: (path: string) => Promise<boolean>;
4
- export declare const encode: (input: string | number | boolean | null | (string | number | boolean | null)[], secretKey?: string | Buffer) => string | number | boolean;
4
+ export declare const encode: (input: string | number | boolean | null | (string | number | boolean | null)[], secretKey?: string | Buffer) => string | number | boolean | null;
5
5
  export declare const decode: (input: string | null | number, fieldType?: FieldType | FieldType[], fieldChildrenType?: FieldType | FieldType[], secretKey?: string | Buffer) => string | number | boolean | null | (string | number | null | boolean)[];
6
6
  export declare const get: (filePath: string, lineNumbers?: number | number[], fieldType?: FieldType | FieldType[], fieldChildrenType?: FieldType | FieldType[], secretKey?: string | Buffer) => Promise<[
7
- Record<number, string | number | boolean | (string | number | boolean | (string | number | boolean)[])[]> | null,
7
+ Record<number, string | number | boolean | null | (string | number | boolean | (string | number | boolean)[] | null)[]> | null,
8
8
  number
9
9
  ]>;
10
10
  export declare const replace: (filePath: string, replacements: string | number | boolean | null | (string | number | boolean | null)[] | Record<number, string | boolean | number | null | (string | boolean | number | null)[]> | Map<number, string | number | boolean | (string | number | boolean)[]>) => Promise<void>;
@@ -20,16 +20,16 @@ export declare const max: (filePath: string, lineNumbers?: number | number[]) =>
20
20
  export declare const min: (filePath: string, lineNumbers?: number | number[]) => Promise<number>;
21
21
  export declare const sort: (filePath: string, sortDirection: 1 | -1 | "asc" | "desc", lineNumbers?: number | number[], _lineNumbersPerChunk?: number) => Promise<void>;
22
22
  export default class File {
23
- static get: (filePath: string, lineNumbers?: number | number[], fieldType?: FieldType | FieldType[], fieldChildrenType?: FieldType | FieldType[], secretKey?: string | Buffer) => Promise<[Record<number, string | number | boolean | (string | number | boolean | (string | number | boolean)[])[]>, number]>;
23
+ static get: (filePath: string, lineNumbers?: number | number[] | undefined, fieldType?: FieldType | FieldType[] | undefined, fieldChildrenType?: FieldType | FieldType[] | undefined, secretKey?: string | Buffer | undefined) => Promise<[Record<number, string | number | boolean | (string | number | boolean | (string | number | boolean)[] | null)[] | null> | null, number]>;
24
24
  static remove: (filePath: string, linesToDelete: number | number[]) => Promise<void>;
25
- static search: (filePath: string, operator: ComparisonOperator | ComparisonOperator[], comparedAtValue: string | number | boolean | (string | number | boolean)[], logicalOperator?: "and" | "or", fieldType?: FieldType | FieldType[], fieldChildrenType?: FieldType | FieldType[], limit?: number, offset?: number, readWholeFile?: boolean, secretKey?: string | Buffer) => Promise<[Record<number, string | number | boolean | (string | number | boolean)[]>, number]>;
26
- static replace: (filePath: string, replacements: string | number | boolean | (string | number | boolean)[] | Record<number, string | number | boolean | (string | number | boolean)[]> | Map<number, string | number | boolean | (string | number | boolean)[]>) => Promise<void>;
25
+ static search: (filePath: string, operator: ComparisonOperator | ComparisonOperator[], comparedAtValue: string | number | boolean | (string | number | boolean | null)[] | null, logicalOperator?: "and" | "or" | undefined, fieldType?: FieldType | FieldType[] | undefined, fieldChildrenType?: FieldType | FieldType[] | undefined, limit?: number | undefined, offset?: number | undefined, readWholeFile?: boolean | undefined, secretKey?: string | Buffer | undefined) => Promise<[Record<number, string | number | boolean | (string | number | boolean | null)[] | null> | null, number]>;
26
+ static replace: (filePath: string, replacements: string | number | boolean | (string | number | boolean | null)[] | Record<number, string | number | boolean | (string | number | boolean | null)[] | null> | Map<number, string | number | boolean | (string | number | boolean)[]> | null) => Promise<void>;
27
27
  static count: (filePath: string) => Promise<number>;
28
- static encode: (input: string | number | boolean | (string | number | boolean)[], secretKey?: string | Buffer) => string | number | boolean;
29
- static decode: (input: string | number, fieldType?: FieldType | FieldType[], fieldChildrenType?: FieldType | FieldType[], secretKey?: string | Buffer) => string | number | boolean | (string | number | boolean)[];
28
+ static encode: (input: string | number | boolean | (string | number | boolean | null)[] | null, secretKey?: string | Buffer | undefined) => string | number | boolean | null;
29
+ static decode: (input: string | number | null, fieldType?: FieldType | FieldType[] | undefined, fieldChildrenType?: FieldType | FieldType[] | undefined, secretKey?: string | Buffer | undefined) => string | number | boolean | (string | number | boolean | null)[] | null;
30
30
  static isExists: (path: string) => Promise<boolean>;
31
- static sum: (filePath: string, lineNumbers?: number | number[]) => Promise<number>;
32
- static min: (filePath: string, lineNumbers?: number | number[]) => Promise<number>;
33
- static max: (filePath: string, lineNumbers?: number | number[]) => Promise<number>;
31
+ static sum: (filePath: string, lineNumbers?: number | number[] | undefined) => Promise<number>;
32
+ static min: (filePath: string, lineNumbers?: number | number[] | undefined) => Promise<number>;
33
+ static max: (filePath: string, lineNumbers?: number | number[] | undefined) => Promise<number>;
34
34
  static append: (filePath: string, data: string | number | (string | number)[], startsAt?: number) => Promise<void>;
35
35
  }
package/dist/file.js CHANGED
@@ -1,10 +1,12 @@
1
- import { open, rename, stat, writeFile } from "node:fs/promises";
1
+ import { open, rename, stat, writeFile, appendFile, } from "node:fs/promises";
2
2
  import { createInterface } from "node:readline";
3
- import { detectFieldType, isArrayOfArrays, isNumber } from "./utils.js";
3
+ import { detectFieldType, isArrayOfArrays, isNumber, isObject, } from "./utils.js";
4
4
  import { encodeID, comparePassword } from "./utils.server.js";
5
- const doesSupportReadLines = () => {
6
- const [major, minor, patch] = process.versions.node.split(".").map(Number);
7
- return major > 18 || (major === 18 && minor >= 11);
5
+ const readLineInternface = (fileHandle) => {
6
+ return createInterface({
7
+ input: fileHandle.createReadStream(),
8
+ crlfDelay: Infinity,
9
+ });
8
10
  };
9
11
  export const isExists = async (path) => {
10
12
  try {
@@ -20,7 +22,7 @@ const secureString = (input) => {
20
22
  if (["true", "false"].includes(String(input)))
21
23
  return input ? 1 : 0;
22
24
  return typeof input === "string"
23
- ? decodeURIComponent(input)
25
+ ? decodeURIComponent(input.replace(/%(?![0-9][0-9a-fA-F]+)/g, ""))
24
26
  .replaceAll("<", "&lt;")
25
27
  .replaceAll(">", "&gt;")
26
28
  .replaceAll(",", "%2C")
@@ -99,7 +101,9 @@ const decodeHelper = (value, fieldType, fieldChildrenType, secretKey) => {
99
101
  : fieldChildrenType, undefined, secretKey))
100
102
  : value;
101
103
  case "id":
102
- return isNumber(value) ? encodeID(value, secretKey) : value;
104
+ return isNumber(value) && secretKey
105
+ ? encodeID(value, secretKey)
106
+ : value;
103
107
  default:
104
108
  return value;
105
109
  }
@@ -118,169 +122,108 @@ export const decode = (input, fieldType, fieldChildrenType, secretKey) => {
118
122
  : input, fieldType, fieldChildrenType, secretKey);
119
123
  };
120
124
  export const get = async (filePath, lineNumbers, fieldType, fieldChildrenType, secretKey) => {
121
- let fileHandle;
122
- try {
123
- fileHandle = await open(filePath, "r");
124
- const rl = doesSupportReadLines()
125
- ? fileHandle.readLines()
126
- : createInterface({
127
- input: fileHandle.createReadStream(),
128
- crlfDelay: Infinity,
129
- });
130
- let lines = new Map(), lineCount = 0;
131
- if (!lineNumbers) {
132
- for await (const line of rl)
133
- lineCount++,
134
- lines.set(lineCount, decode(line, fieldType, fieldChildrenType, secretKey));
135
- }
136
- else if (lineNumbers === -1) {
137
- let lastLine;
138
- for await (const line of rl)
139
- lineCount++, (lastLine = line);
140
- if (lastLine)
141
- lines.set(lineCount, decode(lastLine, fieldType, fieldChildrenType, secretKey));
142
- }
143
- else {
144
- let lineNumbersArray = new Set(Array.isArray(lineNumbers) ? lineNumbers : [lineNumbers]);
145
- for await (const line of rl) {
146
- lineCount++;
147
- if (!lineNumbersArray.has(lineCount))
148
- continue;
125
+ const fileHandle = await open(filePath, "r"), rl = readLineInternface(fileHandle);
126
+ let lines = new Map(), lineCount = 0;
127
+ if (!lineNumbers) {
128
+ for await (const line of rl)
129
+ lineCount++,
149
130
  lines.set(lineCount, decode(line, fieldType, fieldChildrenType, secretKey));
150
- lineNumbersArray.delete(lineCount);
151
- if (!lineNumbersArray.size)
152
- break;
153
- }
154
- }
155
- return [lines.size ? Object.fromEntries(lines) : null, lineCount];
156
131
  }
157
- finally {
158
- await fileHandle?.close();
132
+ else if (lineNumbers === -1) {
133
+ let lastLine = null;
134
+ for await (const line of rl)
135
+ lineCount++, (lastLine = line);
136
+ if (lastLine)
137
+ lines.set(lineCount, decode(lastLine, fieldType, fieldChildrenType, secretKey));
138
+ }
139
+ else {
140
+ let lineNumbersArray = new Set(Array.isArray(lineNumbers) ? lineNumbers : [lineNumbers]);
141
+ for await (const line of rl) {
142
+ lineCount++;
143
+ if (!lineNumbersArray.has(lineCount))
144
+ continue;
145
+ lines.set(lineCount, decode(line, fieldType, fieldChildrenType, secretKey));
146
+ lineNumbersArray.delete(lineCount);
147
+ if (!lineNumbersArray.size)
148
+ break;
149
+ }
159
150
  }
151
+ await fileHandle.close();
152
+ return [lines.size ? Object.fromEntries(lines) : null, lineCount];
160
153
  };
161
154
  export const replace = async (filePath, replacements) => {
162
155
  if (await isExists(filePath)) {
163
- const fileTempPath = `${filePath.replace(".inib", "")}-${Date.now()}.tmp`;
164
- let fileHandle, fileTempHandle, lineCount = 0;
165
- try {
166
- fileHandle = await open(filePath, "r");
167
- fileTempHandle = await open(fileTempPath, "w+");
168
- const rl = doesSupportReadLines()
169
- ? fileHandle.readLines()
170
- : createInterface({
171
- input: fileHandle.createReadStream(),
172
- crlfDelay: Infinity,
173
- }), writeStream = fileTempHandle.createWriteStream();
174
- if (typeof replacements === "object" && !Array.isArray(replacements)) {
175
- if (!(replacements instanceof Map))
176
- replacements = new Map(Object.entries(replacements));
177
- for await (const line of rl) {
178
- lineCount++;
179
- writeStream.write((replacements.has(lineCount.toString())
180
- ? replacements.get(lineCount.toString())
181
- : line) + "\n");
182
- }
183
- const newLinesNumbers = new Set([...replacements.keys()].filter((num) => num > lineCount));
184
- if (newLinesNumbers.size) {
185
- if (Math.min(...newLinesNumbers) - lineCount - 1 > 1)
186
- writeStream.write("\n".repeat(Math.min(...newLinesNumbers) - lineCount - 1));
187
- for (const newLineNumber of newLinesNumbers)
188
- writeStream.write(replacements.get(newLineNumber.toString()) + "\n");
189
- }
156
+ let lineCount = 0;
157
+ const fileHandle = await open(filePath, "r"), fileTempPath = `${filePath.replace(".inib", "")}-${Date.now()}.tmp`, fileTempHandle = await open(fileTempPath, "w"), rl = readLineInternface(fileHandle), writeStream = fileTempHandle.createWriteStream();
158
+ if (isObject(replacements)) {
159
+ if (!(replacements instanceof Map))
160
+ replacements = new Map(Object.entries(replacements));
161
+ for await (const line of rl) {
162
+ lineCount++;
163
+ writeStream.write((replacements.has(lineCount.toString())
164
+ ? replacements.get(lineCount.toString())
165
+ : line) + "\n");
166
+ }
167
+ const newLinesNumbers = new Set([...replacements.keys()].filter((num) => num > lineCount));
168
+ if (newLinesNumbers.size) {
169
+ if (Math.min(...newLinesNumbers) - lineCount - 1 > 1)
170
+ writeStream.write("\n".repeat(Math.min(...newLinesNumbers) - lineCount - 1));
171
+ for await (const newLineNumber of newLinesNumbers)
172
+ writeStream.write(replacements.get(newLineNumber.toString()) + "\n");
190
173
  }
191
- else
192
- for await (const _line of rl)
193
- writeStream.write(replacements + "\n");
194
- await rename(fileTempPath, filePath);
195
- }
196
- finally {
197
- await fileHandle?.close();
198
- await fileTempHandle?.close();
199
174
  }
175
+ else
176
+ for await (const _line of rl)
177
+ writeStream.write(replacements + "\n");
178
+ await fileHandle.close();
179
+ await fileTempHandle.close();
180
+ await rename(fileTempPath, filePath);
200
181
  }
201
- else if (typeof replacements === "object" && !Array.isArray(replacements)) {
182
+ else if (isObject(replacements)) {
202
183
  if (!(replacements instanceof Map))
203
- replacements = new Map(Object.entries(replacements));
184
+ replacements = new Map(Object.entries(replacements).map(([key, value]) => [Number(key), value]));
204
185
  await writeFile(filePath, (Math.min(...replacements.keys()) - 1 > 1
205
186
  ? "\n".repeat(Math.min(...replacements.keys()) - 1)
206
187
  : "") +
207
- [...new Map([...replacements].sort(([a], [b]) => a - b)).values()].join("\n") +
188
+ Array.from(new Map([...replacements.entries()].sort(([keyA], [keyB]) => keyA - keyB)).values()).join("\n") +
208
189
  "\n");
209
190
  }
210
191
  };
211
192
  export const append = async (filePath, data, startsAt = 1) => {
212
- let fileHandle;
213
- try {
214
- fileHandle = await open(filePath, "a");
215
- const doesFileExists = await isExists(filePath);
216
- const writeStream = fileHandle.createWriteStream();
217
- if (doesFileExists) {
218
- const currentNumberOfLines = await count(filePath);
219
- if (startsAt - currentNumberOfLines - 1 > 0)
220
- writeStream.write("\n".repeat(startsAt - currentNumberOfLines - 1));
221
- if (Array.isArray(data)) {
222
- for (const input of data)
223
- writeStream.write(input + "\n");
224
- }
225
- else
226
- writeStream.write(data + "\n");
227
- }
228
- else {
229
- if (startsAt - 1 > 0)
230
- writeStream.write("\n".repeat(startsAt - 1));
231
- if (Array.isArray(data)) {
232
- for (const input of data)
233
- writeStream.write(input + "\n");
234
- }
235
- else
236
- writeStream.write(data + "\n");
237
- }
238
- }
239
- finally {
240
- await fileHandle?.close();
241
- }
193
+ let currentNumberOfLines = 0;
194
+ const doesFileExists = await isExists(filePath);
195
+ if (doesFileExists)
196
+ currentNumberOfLines = await count(filePath);
197
+ await appendFile(filePath, (currentNumberOfLines > 0
198
+ ? startsAt - currentNumberOfLines - 1 > 0
199
+ ? "\n".repeat(startsAt - currentNumberOfLines - 1)
200
+ : ""
201
+ : "") +
202
+ (Array.isArray(data) ? data.join("\n") : data) +
203
+ "\n");
242
204
  };
243
205
  export const remove = async (filePath, linesToDelete) => {
244
- const fileTempPath = `${filePath.replace(".inib", "")}-${Date.now()}.tmp`;
245
- let fileHandle, fileTempHandle, lineCount = 0;
246
- try {
247
- fileHandle = await open(filePath, "r");
248
- fileTempHandle = await open(fileTempPath, "w+");
249
- const linesToDeleteArray = new Set(Array.isArray(linesToDelete) ? linesToDelete : [linesToDelete]), rl = doesSupportReadLines()
250
- ? fileHandle.readLines()
251
- : createInterface({
252
- input: fileHandle.createReadStream(),
253
- crlfDelay: Infinity,
254
- }), writeStream = fileTempHandle.createWriteStream();
255
- for await (const line of rl) {
256
- lineCount++;
257
- if (!linesToDeleteArray.has(lineCount))
258
- writeStream.write(`${line}\n`);
259
- }
260
- await rename(fileTempPath, filePath);
261
- }
262
- finally {
263
- await fileTempHandle?.close();
264
- await fileHandle?.close();
206
+ let lineCount = 0;
207
+ const fileHandle = await open(filePath, "r"), fileTempPath = `${filePath.replace(".inib", "")}-${Date.now()}.tmp`, fileTempHandle = await open(fileTempPath, "w"), linesToDeleteArray = new Set(Array.isArray(linesToDelete)
208
+ ? linesToDelete.map(Number)
209
+ : [Number(linesToDelete)]), rl = readLineInternface(fileHandle), writeStream = fileTempHandle.createWriteStream();
210
+ for await (const line of rl) {
211
+ lineCount++;
212
+ if (!linesToDeleteArray.has(lineCount))
213
+ writeStream.write(`${line}\n`);
265
214
  }
215
+ await rename(fileTempPath, filePath);
216
+ await fileTempHandle.close();
217
+ await fileHandle.close();
266
218
  };
267
219
  export const count = async (filePath) => {
268
- let fileHandle, lineCount = 0;
269
- try {
270
- fileHandle = await open(filePath, "r");
271
- const rl = doesSupportReadLines()
272
- ? fileHandle.readLines()
273
- : createInterface({
274
- input: fileHandle.createReadStream(),
275
- crlfDelay: Infinity,
276
- });
277
- for await (const line of rl)
278
- lineCount++;
279
- return lineCount;
280
- }
281
- finally {
282
- await fileHandle.close();
283
- }
220
+ // return Number((await exec(`wc -l < ${filePath}`)).stdout.trim());
221
+ let lineCount = 0;
222
+ const fileHandle = await open(filePath, "r"), rl = readLineInternface(fileHandle);
223
+ for await (const line of rl)
224
+ lineCount++;
225
+ await fileHandle.close();
226
+ return lineCount;
284
227
  };
285
228
  const handleComparisonOperator = (operator, originalValue, comparedAtValue, fieldType, fieldChildrenType) => {
286
229
  if (Array.isArray(fieldType))
@@ -304,13 +247,21 @@ const handleComparisonOperator = (operator, originalValue, comparedAtValue, fiel
304
247
  case "!=":
305
248
  return !handleComparisonOperator("=", originalValue, comparedAtValue, fieldType);
306
249
  case ">":
307
- return originalValue > comparedAtValue;
250
+ return (originalValue !== null &&
251
+ comparedAtValue !== null &&
252
+ originalValue > comparedAtValue);
308
253
  case "<":
309
- return originalValue < comparedAtValue;
254
+ return (originalValue !== null &&
255
+ comparedAtValue !== null &&
256
+ originalValue < comparedAtValue);
310
257
  case ">=":
311
- return originalValue >= comparedAtValue;
258
+ return (originalValue !== null &&
259
+ comparedAtValue !== null &&
260
+ originalValue >= comparedAtValue);
312
261
  case "<=":
313
- return originalValue <= comparedAtValue;
262
+ return (originalValue !== null &&
263
+ comparedAtValue !== null &&
264
+ originalValue <= comparedAtValue);
314
265
  case "[]":
315
266
  return ((Array.isArray(originalValue) &&
316
267
  Array.isArray(comparedAtValue) &&
@@ -334,153 +285,110 @@ const handleComparisonOperator = (operator, originalValue, comparedAtValue, fiel
334
285
  }
335
286
  };
336
287
  export const search = async (filePath, operator, comparedAtValue, logicalOperator, fieldType, fieldChildrenType, limit, offset, readWholeFile, secretKey) => {
337
- let fileHandle, RETURN = new Map(), lineCount = 0, foundItems = 0;
338
- try {
339
- fileHandle = await open(filePath, "r");
340
- const rl = doesSupportReadLines()
341
- ? fileHandle.readLines()
342
- : createInterface({
343
- input: fileHandle.createReadStream(),
344
- crlfDelay: Infinity,
345
- });
346
- for await (const line of rl) {
347
- lineCount++;
348
- const decodedLine = decode(line, fieldType, fieldChildrenType, secretKey);
349
- if ((Array.isArray(operator) &&
350
- Array.isArray(comparedAtValue) &&
351
- ((logicalOperator &&
352
- logicalOperator === "or" &&
353
- operator.some((single_operator, index) => handleComparisonOperator(single_operator, decodedLine, comparedAtValue[index], fieldType))) ||
354
- operator.every((single_operator, index) => handleComparisonOperator(single_operator, decodedLine, comparedAtValue[index], fieldType)))) ||
355
- (!Array.isArray(operator) &&
356
- handleComparisonOperator(operator, decodedLine, comparedAtValue, fieldType))) {
357
- foundItems++;
358
- if (offset && foundItems < offset)
288
+ let RETURN = new Map(), lineCount = 0, foundItems = 0;
289
+ const fileHandle = await open(filePath, "r"), rl = readLineInternface(fileHandle);
290
+ for await (const line of rl) {
291
+ lineCount++;
292
+ const decodedLine = decode(line, fieldType, fieldChildrenType, secretKey);
293
+ if ((Array.isArray(operator) &&
294
+ Array.isArray(comparedAtValue) &&
295
+ ((logicalOperator &&
296
+ logicalOperator === "or" &&
297
+ operator.some((single_operator, index) => handleComparisonOperator(single_operator, decodedLine, comparedAtValue[index], fieldType))) ||
298
+ operator.every((single_operator, index) => handleComparisonOperator(single_operator, decodedLine, comparedAtValue[index], fieldType)))) ||
299
+ (!Array.isArray(operator) &&
300
+ handleComparisonOperator(operator, decodedLine, comparedAtValue, fieldType))) {
301
+ foundItems++;
302
+ if (offset && foundItems < offset)
303
+ continue;
304
+ if (limit && foundItems > limit)
305
+ if (readWholeFile)
359
306
  continue;
360
- if (limit && foundItems > limit)
361
- if (readWholeFile)
362
- continue;
363
- else
364
- break;
365
- RETURN.set(lineCount, decodedLine);
366
- }
307
+ else
308
+ break;
309
+ RETURN.set(lineCount, decodedLine);
367
310
  }
368
- return foundItems
369
- ? [
370
- Object.fromEntries(RETURN),
371
- readWholeFile ? foundItems : foundItems - 1,
372
- ]
373
- : [null, 0];
374
- }
375
- finally {
376
- await fileHandle?.close();
377
311
  }
312
+ await fileHandle.close();
313
+ return foundItems
314
+ ? [Object.fromEntries(RETURN), readWholeFile ? foundItems : foundItems - 1]
315
+ : [null, 0];
378
316
  };
379
317
  export const sum = async (filePath, lineNumbers) => {
380
- let fileHandle, sum = 0;
381
- try {
382
- fileHandle = await open(filePath, "r");
383
- const rl = doesSupportReadLines()
384
- ? fileHandle.readLines()
385
- : createInterface({
386
- input: fileHandle.createReadStream(),
387
- crlfDelay: Infinity,
388
- });
389
- if (lineNumbers) {
390
- let lineCount = 0;
391
- let lineNumbersArray = new Set(Array.isArray(lineNumbers) ? lineNumbers : [lineNumbers]);
392
- for await (const line of rl) {
393
- lineCount++;
394
- if (!lineNumbersArray.has(lineCount))
395
- continue;
396
- sum += +decode(line, "number");
397
- lineNumbersArray.delete(lineCount);
398
- if (!lineNumbersArray.size)
399
- break;
400
- }
318
+ let sum = 0;
319
+ const fileHandle = await open(filePath, "r"), rl = readLineInternface(fileHandle);
320
+ if (lineNumbers) {
321
+ let lineCount = 0;
322
+ let lineNumbersArray = new Set(Array.isArray(lineNumbers) ? lineNumbers : [lineNumbers]);
323
+ for await (const line of rl) {
324
+ lineCount++;
325
+ if (!lineNumbersArray.has(lineCount))
326
+ continue;
327
+ sum += +(decode(line, "number") ?? 0);
328
+ lineNumbersArray.delete(lineCount);
329
+ if (!lineNumbersArray.size)
330
+ break;
401
331
  }
402
- else
403
- for await (const line of rl)
404
- sum += +decode(line, "number");
405
- return sum;
406
- }
407
- finally {
408
- await fileHandle?.close();
409
332
  }
333
+ else
334
+ for await (const line of rl)
335
+ sum += +(decode(line, "number") ?? 0);
336
+ await fileHandle.close();
337
+ return sum;
410
338
  };
411
339
  export const max = async (filePath, lineNumbers) => {
412
- let fileHandle, max = 0;
413
- try {
414
- fileHandle = await open(filePath, "r");
415
- const rl = doesSupportReadLines()
416
- ? fileHandle.readLines()
417
- : createInterface({
418
- input: fileHandle.createReadStream(),
419
- crlfDelay: Infinity,
420
- });
421
- if (lineNumbers) {
422
- let lineCount = 0;
423
- let lineNumbersArray = new Set(Array.isArray(lineNumbers) ? lineNumbers : [lineNumbers]);
424
- for await (const line of rl) {
425
- lineCount++;
426
- if (!lineNumbersArray.has(lineCount))
427
- continue;
428
- const lineContentNum = +decode(line, "number");
429
- if (lineContentNum > max)
430
- max = lineContentNum;
431
- lineNumbersArray.delete(lineCount);
432
- if (!lineNumbersArray.size)
433
- break;
434
- }
340
+ let max = 0;
341
+ const fileHandle = await open(filePath, "r"), rl = readLineInternface(fileHandle);
342
+ if (lineNumbers) {
343
+ let lineCount = 0;
344
+ let lineNumbersArray = new Set(Array.isArray(lineNumbers) ? lineNumbers : [lineNumbers]);
345
+ for await (const line of rl) {
346
+ lineCount++;
347
+ if (!lineNumbersArray.has(lineCount))
348
+ continue;
349
+ const lineContentNum = +(decode(line, "number") ?? 0);
350
+ if (lineContentNum > max)
351
+ max = lineContentNum;
352
+ lineNumbersArray.delete(lineCount);
353
+ if (!lineNumbersArray.size)
354
+ break;
435
355
  }
436
- else
437
- for await (const line of rl) {
438
- const lineContentNum = +decode(line, "number");
439
- if (lineContentNum > max)
440
- max = lineContentNum;
441
- }
442
- return max;
443
- }
444
- finally {
445
- await fileHandle?.close();
446
356
  }
357
+ else
358
+ for await (const line of rl) {
359
+ const lineContentNum = +(decode(line, "number") ?? 0);
360
+ if (lineContentNum > max)
361
+ max = lineContentNum;
362
+ }
363
+ await fileHandle.close();
364
+ return max;
447
365
  };
448
366
  export const min = async (filePath, lineNumbers) => {
449
- let fileHandle, min = 0;
450
- try {
451
- fileHandle = await open(filePath, "r");
452
- const rl = doesSupportReadLines()
453
- ? fileHandle.readLines()
454
- : createInterface({
455
- input: fileHandle.createReadStream(),
456
- crlfDelay: Infinity,
457
- });
458
- if (lineNumbers) {
459
- let lineCount = 0;
460
- let lineNumbersArray = new Set(Array.isArray(lineNumbers) ? lineNumbers : [lineNumbers]);
461
- for await (const line of rl) {
462
- lineCount++;
463
- if (!lineNumbersArray.has(lineCount))
464
- continue;
465
- const lineContentNum = +decode(line, "number");
466
- if (lineContentNum < min)
467
- min = lineContentNum;
468
- lineNumbersArray.delete(lineCount);
469
- if (!lineNumbersArray.size)
470
- break;
471
- }
367
+ let min = 0;
368
+ const fileHandle = await open(filePath, "r"), rl = readLineInternface(fileHandle);
369
+ if (lineNumbers) {
370
+ let lineCount = 0;
371
+ let lineNumbersArray = new Set(Array.isArray(lineNumbers) ? lineNumbers : [lineNumbers]);
372
+ for await (const line of rl) {
373
+ lineCount++;
374
+ if (!lineNumbersArray.has(lineCount))
375
+ continue;
376
+ const lineContentNum = +(decode(line, "number") ?? 0);
377
+ if (lineContentNum < min)
378
+ min = lineContentNum;
379
+ lineNumbersArray.delete(lineCount);
380
+ if (!lineNumbersArray.size)
381
+ break;
472
382
  }
473
- else
474
- for await (const line of rl) {
475
- const lineContentNum = +decode(line, "number");
476
- if (lineContentNum < min)
477
- min = lineContentNum;
478
- }
479
- return min;
480
- }
481
- finally {
482
- await fileHandle?.close();
483
383
  }
384
+ else
385
+ for await (const line of rl) {
386
+ const lineContentNum = +(decode(line, "number") ?? 0);
387
+ if (lineContentNum < min)
388
+ min = lineContentNum;
389
+ }
390
+ await fileHandle.close();
391
+ return min;
484
392
  };
485
393
  export const sort = async (filePath, sortDirection, lineNumbers, _lineNumbersPerChunk = 100000) => { };
486
394
  export default class File {
package/dist/index.d.ts CHANGED
@@ -59,7 +59,7 @@ declare global {
59
59
  export default class Inibase {
60
60
  folder: string;
61
61
  database: string;
62
- table: string;
62
+ table: string | null;
63
63
  pageInfo: pageInfo;
64
64
  private cache;
65
65
  private totalItems;
@@ -69,8 +69,9 @@ export default class Inibase {
69
69
  setTableSchema(tableName: string, schema: Schema): Promise<void>;
70
70
  getTableSchema(tableName: string): Promise<Schema | undefined>;
71
71
  getField<Property extends keyof Field | "children">(keyPath: string, schema: Schema | Field, property?: Property): any;
72
- validateData(data: Data | Data[], schema: Schema, skipRequiredField?: boolean): void;
73
- formatData<dataType extends Data | Data[]>(data: dataType, schema: Schema, formatOnlyAvailiableKeys?: boolean): dataType extends Data ? Data : Data[];
72
+ private validateData;
73
+ private formatField;
74
+ private formatData;
74
75
  private getDefaultValue;
75
76
  private joinPathesContents;
76
77
  private getItemsFromSchema;
@@ -78,10 +79,10 @@ export default class Inibase {
78
79
  private applyCriteria;
79
80
  get(tableName: string, where?: string | number | (string | number)[] | Criteria | undefined, options?: Options | undefined, onlyOne?: true, onlyLinesNumbers?: undefined): Promise<Data | null>;
80
81
  get(tableName: string, where?: string | number | (string | number)[] | Criteria | undefined, options?: Options | undefined, onlyOne?: boolean | undefined, onlyLinesNumbers?: true): Promise<number[] | null>;
81
- post(tableName: string, data: Data | Data[], options: Options | undefined, returnPostedData?: false): Promise<void | null>;
82
+ post(tableName: string, data: Data | Data[], options?: Options, returnPostedData?: false): Promise<void | null>;
82
83
  post(tableName: string, data: Data, options: Options | undefined, returnPostedData: true): Promise<Data | null>;
83
84
  post(tableName: string, data: Data[], options: Options | undefined, returnPostedData: true): Promise<Data[] | null>;
84
- put(tableName: string, data: Data | Data[], where?: number | string | (number | string)[] | Criteria | undefined, options?: Options | undefined, returnPostedData?: false): Promise<void | null>;
85
+ put(tableName: string, data: Data | Data[], where?: number | string | (number | string)[] | Criteria, options?: Options, returnPostedData?: false): Promise<void | null>;
85
86
  put(tableName: string, data: Data, where: number | string | (number | string)[] | Criteria | undefined, options: Options | undefined, returnPostedData: true): Promise<Data | null>;
86
87
  put(tableName: string, data: Data[], where: number | string | (number | string)[] | Criteria | undefined, options: Options | undefined, returnPostedData: true): Promise<Data[] | null>;
87
88
  delete(tableName: string, where?: number | string, _id?: string | string[]): Promise<string | null>;