inibase 1.1.4 → 1.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -0
- package/dist/index.d.ts +5 -4
- package/dist/index.js +70 -6
- package/package.json +1 -1
package/README.md
CHANGED
package/dist/index.d.ts
CHANGED
|
@@ -50,19 +50,20 @@ declare global {
|
|
|
50
50
|
entries<T extends object>(o: T): Entries<T>;
|
|
51
51
|
}
|
|
52
52
|
}
|
|
53
|
-
export type ErrorCodes = "FIELD_UNIQUE" | "FIELD_REQUIRED" | "NO_SCHEMA" | "TABLE_EMPTY" | "INVALID_ID" | "INVALID_TYPE" | "INVALID_PARAMETERS" | "NO_ENV" | "TABLE_EXISTS" | "TABLE_NOT_EXISTS" | "INVALID_REGEX_MATCH";
|
|
54
|
-
export type ErrorLang = "en";
|
|
53
|
+
export type ErrorCodes = "GROUP_UNIQUE" | "FIELD_UNIQUE" | "FIELD_REQUIRED" | "NO_SCHEMA" | "TABLE_EMPTY" | "INVALID_ID" | "INVALID_TYPE" | "INVALID_PARAMETERS" | "NO_ENV" | "TABLE_EXISTS" | "TABLE_NOT_EXISTS" | "INVALID_REGEX_MATCH";
|
|
54
|
+
export type ErrorLang = "en" | "ar" | "fr" | "es";
|
|
55
55
|
export default class Inibase {
|
|
56
56
|
pageInfo: Record<string, pageInfo>;
|
|
57
|
+
language: ErrorLang;
|
|
57
58
|
salt: Buffer;
|
|
58
59
|
private databasePath;
|
|
59
60
|
private fileExtension;
|
|
60
61
|
private tablesMap;
|
|
61
62
|
private uniqueMap;
|
|
62
63
|
private totalItems;
|
|
63
|
-
constructor(database: string, mainFolder?: string);
|
|
64
|
+
constructor(database: string, mainFolder?: string, language?: ErrorLang);
|
|
64
65
|
private static errorMessages;
|
|
65
|
-
createError(name: ErrorCodes, variable?: string | number | (string | number)[]
|
|
66
|
+
createError(name: ErrorCodes, variable?: string | number | (string | number)[]): Error;
|
|
66
67
|
clear(): void;
|
|
67
68
|
private getFileExtension;
|
|
68
69
|
private _schemaToIdsPath;
|
package/dist/index.js
CHANGED
|
@@ -12,15 +12,17 @@ import * as UtilsServer from "./utils.server.js";
|
|
|
12
12
|
process.removeAllListeners("warning");
|
|
13
13
|
export default class Inibase {
|
|
14
14
|
pageInfo;
|
|
15
|
+
language;
|
|
15
16
|
salt;
|
|
16
17
|
databasePath;
|
|
17
18
|
fileExtension = ".txt";
|
|
18
19
|
tablesMap;
|
|
19
20
|
uniqueMap;
|
|
20
21
|
totalItems;
|
|
21
|
-
constructor(database, mainFolder = ".") {
|
|
22
|
+
constructor(database, mainFolder = ".", language = "en") {
|
|
22
23
|
this.databasePath = join(mainFolder, database);
|
|
23
24
|
this.clear();
|
|
25
|
+
this.language = language;
|
|
24
26
|
if (!process.env.INIBASE_SECRET) {
|
|
25
27
|
if (existsSync(".env") &&
|
|
26
28
|
readFileSync(".env").includes("INIBASE_SECRET="))
|
|
@@ -37,6 +39,7 @@ export default class Inibase {
|
|
|
37
39
|
TABLE_EXISTS: "Table {variable} already exists",
|
|
38
40
|
TABLE_NOT_EXISTS: "Table {variable} doesn't exist",
|
|
39
41
|
NO_SCHEMA: "Table {variable} does't have a schema",
|
|
42
|
+
GROUP_UNIQUE: "Group {variable} should be unique, got duplicated content in {variable}",
|
|
40
43
|
FIELD_UNIQUE: "Field {variable} should be unique, got {variable} instead",
|
|
41
44
|
FIELD_REQUIRED: "Field {variable} is required",
|
|
42
45
|
INVALID_ID: "The given ID(s) is/are not valid(s)",
|
|
@@ -47,9 +50,57 @@ export default class Inibase {
|
|
|
47
50
|
? "please run with '--env-file=.env'"
|
|
48
51
|
: "please use dotenv",
|
|
49
52
|
},
|
|
53
|
+
ar: {
|
|
54
|
+
TABLE_EMPTY: "الجدول {variable} فارغ",
|
|
55
|
+
TABLE_EXISTS: "الجدول {variable} موجود بالفعل",
|
|
56
|
+
TABLE_NOT_EXISTS: "الجدول {variable} غير موجود",
|
|
57
|
+
NO_SCHEMA: "الجدول {variable} ليس لديه مخطط",
|
|
58
|
+
GROUP_UNIQUE: "المجموعة {variable} يجب أن تكون فريدة، تم العثور على محتوى مكرر في {variable}",
|
|
59
|
+
FIELD_UNIQUE: "الحقل {variable} يجب أن يكون فريدًا، تم العثور على {variable} بدلاً من ذلك",
|
|
60
|
+
FIELD_REQUIRED: "الحقل {variable} مطلوب",
|
|
61
|
+
INVALID_ID: "المعرف أو المعرفات المقدمة غير صالحة",
|
|
62
|
+
INVALID_TYPE: "من المتوقع أن يكون {variable} من النوع {variable}، لكن تم العثور على {variable} بدلاً من ذلك",
|
|
63
|
+
INVALID_PARAMETERS: "المعلمات المقدمة غير صالحة",
|
|
64
|
+
INVALID_REGEX_MATCH: "الحقل {variable} لا يتطابق مع النمط المتوقع",
|
|
65
|
+
NO_ENV: Number(process.versions.node.split(".").reduce((a, b) => a + b)) >= 26
|
|
66
|
+
? "يرجى التشغيل باستخدام '--env-file=.env'"
|
|
67
|
+
: "يرجى استخدام dotenv",
|
|
68
|
+
},
|
|
69
|
+
fr: {
|
|
70
|
+
TABLE_EMPTY: "La table {variable} est vide",
|
|
71
|
+
TABLE_EXISTS: "La table {variable} existe déjà",
|
|
72
|
+
TABLE_NOT_EXISTS: "La table {variable} n'existe pas",
|
|
73
|
+
NO_SCHEMA: "La table {variable} n'a pas de schéma",
|
|
74
|
+
GROUP_UNIQUE: "Le groupe {variable} doit être unique, contenu dupliqué trouvé dans {variable}",
|
|
75
|
+
FIELD_UNIQUE: "Le champ {variable} doit être unique, trouvé {variable} à la place",
|
|
76
|
+
FIELD_REQUIRED: "Le champ {variable} est obligatoire",
|
|
77
|
+
INVALID_ID: "Le(s) ID donné(s) n'est/ne sont pas valide(s)",
|
|
78
|
+
INVALID_TYPE: "Attendu que {variable} soit de type {variable}, mais trouvé {variable} à la place",
|
|
79
|
+
INVALID_PARAMETERS: "Les paramètres donnés ne sont pas valides",
|
|
80
|
+
INVALID_REGEX_MATCH: "Le champ {variable} ne correspond pas au modèle attendu",
|
|
81
|
+
NO_ENV: Number(process.versions.node.split(".").reduce((a, b) => a + b)) >= 26
|
|
82
|
+
? "veuillez exécuter avec '--env-file=.env'"
|
|
83
|
+
: "veuillez utiliser dotenv",
|
|
84
|
+
},
|
|
85
|
+
es: {
|
|
86
|
+
TABLE_EMPTY: "La tabla {variable} está vacía",
|
|
87
|
+
TABLE_EXISTS: "La tabla {variable} ya existe",
|
|
88
|
+
TABLE_NOT_EXISTS: "La tabla {variable} no existe",
|
|
89
|
+
NO_SCHEMA: "La tabla {variable} no tiene un esquema",
|
|
90
|
+
GROUP_UNIQUE: "El grupo {variable} debe ser único, se encontró contenido duplicado en {variable}",
|
|
91
|
+
FIELD_UNIQUE: "El campo {variable} debe ser único, se encontró {variable} en su lugar",
|
|
92
|
+
FIELD_REQUIRED: "El campo {variable} es obligatorio",
|
|
93
|
+
INVALID_ID: "El/los ID proporcionado(s) no es/son válido(s)",
|
|
94
|
+
INVALID_TYPE: "Se espera que {variable} sea {variable}, pero se encontró {variable} en su lugar",
|
|
95
|
+
INVALID_PARAMETERS: "Los parámetros proporcionados no son válidos",
|
|
96
|
+
INVALID_REGEX_MATCH: "El campo {variable} no coincide con el patrón esperado",
|
|
97
|
+
NO_ENV: Number(process.versions.node.split(".").reduce((a, b) => a + b)) >= 26
|
|
98
|
+
? "por favor ejecute con '--env-file=.env'"
|
|
99
|
+
: "por favor use dotenv",
|
|
100
|
+
},
|
|
50
101
|
};
|
|
51
|
-
createError(name, variable
|
|
52
|
-
const errorMessage = Inibase.errorMessages[language]?.[name];
|
|
102
|
+
createError(name, variable) {
|
|
103
|
+
const errorMessage = Inibase.errorMessages[this.language]?.[name];
|
|
53
104
|
if (!errorMessage)
|
|
54
105
|
return new Error("ERR");
|
|
55
106
|
const error = new Error(variable
|
|
@@ -332,6 +383,10 @@ export default class Inibase {
|
|
|
332
383
|
Utils.isArrayOfObjects(field.children))
|
|
333
384
|
this._validateData(data[field.key], field.children, skipRequiredField);
|
|
334
385
|
else {
|
|
386
|
+
if (field.table &&
|
|
387
|
+
Utils.isObject(data[field.key]) &&
|
|
388
|
+
Object.hasOwn(data[field.key], "id"))
|
|
389
|
+
data[field.key] = data[field.key].id;
|
|
335
390
|
if (field.regex) {
|
|
336
391
|
const regex = UtilsServer.getCachedRegex(field.regex);
|
|
337
392
|
if (!regex.test(data[field.key]))
|
|
@@ -366,8 +421,9 @@ export default class Inibase {
|
|
|
366
421
|
}
|
|
367
422
|
}
|
|
368
423
|
async validateData(tableName, data, skipRequiredField = false) {
|
|
424
|
+
const clonedData = structuredClone(data);
|
|
369
425
|
// Skip ID and (created|updated)At
|
|
370
|
-
this._validateData(
|
|
426
|
+
this._validateData(clonedData, this.tablesMap.get(tableName).schema.slice(1, -2), skipRequiredField);
|
|
371
427
|
await this.checkUnique(tableName);
|
|
372
428
|
}
|
|
373
429
|
cleanObject(obj) {
|
|
@@ -455,16 +511,24 @@ export default class Inibase {
|
|
|
455
511
|
let index = 0;
|
|
456
512
|
let shouldContinueParent = false; // Flag to manage parent loop continuation
|
|
457
513
|
const mergedLineNumbers = new Set();
|
|
514
|
+
const fieldsKeys = [];
|
|
458
515
|
for await (const [columnID, values] of valueObject.columnsValues) {
|
|
459
516
|
index++;
|
|
460
517
|
const field = flattenSchema.find(({ id }) => id === columnID);
|
|
518
|
+
fieldsKeys.push(field.key);
|
|
461
519
|
const [_, totalLines, lineNumbers] = await File.search(join(tablePath, `${field.key}${this.getFileExtension(tableName)}`), "[]", Array.from(values), undefined, valueObject.exclude, field.type, field.children, 1, undefined, false, this.salt);
|
|
462
520
|
if (totalLines > 0) {
|
|
463
521
|
if (valueObject.columnsValues.size === 1 ||
|
|
464
|
-
|
|
522
|
+
(valueObject.columnsValues.size === index &&
|
|
523
|
+
hasDuplicates(lineNumbers, mergedLineNumbers))) {
|
|
465
524
|
this.uniqueMap = new Map();
|
|
525
|
+
if (valueObject.columnsValues.size > 1)
|
|
526
|
+
throw this.createError("GROUP_UNIQUE", [
|
|
527
|
+
fieldsKeys.join(" & "),
|
|
528
|
+
field.key,
|
|
529
|
+
]);
|
|
466
530
|
throw this.createError("FIELD_UNIQUE", [
|
|
467
|
-
|
|
531
|
+
fieldsKeys.join(" & "),
|
|
468
532
|
Array.from(values).join(", "),
|
|
469
533
|
]);
|
|
470
534
|
}
|