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 +10 -10
- package/dist/file.js +192 -284
- package/dist/index.d.ts +6 -5
- package/dist/index.js +174 -133
- package/dist/utils.d.ts +5 -5
- package/dist/utils.js +3 -12
- package/dist/utils.server.d.ts +2 -2
- package/dist/utils.server.js +5 -5
- package/package.json +6 -3
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)[])[]
|
|
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)[]
|
|
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
|
|
6
|
-
|
|
7
|
-
|
|
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("<", "<")
|
|
25
27
|
.replaceAll(">", ">")
|
|
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)
|
|
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
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
const
|
|
125
|
-
|
|
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
|
-
|
|
158
|
-
|
|
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
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
const
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
writeStream.write(
|
|
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 (
|
|
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
|
-
|
|
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
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
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
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
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
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
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
|
|
250
|
+
return (originalValue !== null &&
|
|
251
|
+
comparedAtValue !== null &&
|
|
252
|
+
originalValue > comparedAtValue);
|
|
308
253
|
case "<":
|
|
309
|
-
return originalValue
|
|
254
|
+
return (originalValue !== null &&
|
|
255
|
+
comparedAtValue !== null &&
|
|
256
|
+
originalValue < comparedAtValue);
|
|
310
257
|
case ">=":
|
|
311
|
-
return originalValue
|
|
258
|
+
return (originalValue !== null &&
|
|
259
|
+
comparedAtValue !== null &&
|
|
260
|
+
originalValue >= comparedAtValue);
|
|
312
261
|
case "<=":
|
|
313
|
-
return originalValue
|
|
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
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
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
|
-
|
|
361
|
-
|
|
362
|
-
|
|
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
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
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
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
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
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
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
|
|
73
|
-
|
|
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
|
|
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
|
|
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>;
|