Roll Back compile version

This commit is contained in:
Benjamin Toby
2025-07-05 16:14:11 +01:00
parent 4f4eb44a98
commit 728183b827
251 changed files with 10169 additions and 7458 deletions
+19 -13
View File
@@ -1,18 +1,24 @@
import fs from "fs";
import grabDirNames from "../../utils/backend/names/grab-dir-names";
import _ from "lodash";
import EJSON from "../../utils/ejson";
import generateTypeDefinition from "./generate-type-definitions";
import { AppNames } from "../../dict/app-names";
export default function dbSchemaToType(params) {
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.default = dbSchemaToType;
const fs_1 = __importDefault(require("fs"));
const grab_dir_names_1 = __importDefault(require("../../utils/backend/names/grab-dir-names"));
const lodash_1 = __importDefault(require("lodash"));
const ejson_1 = __importDefault(require("../../utils/ejson"));
const generate_type_definitions_1 = __importDefault(require("./generate-type-definitions"));
const app_names_1 = require("../../dict/app-names");
function dbSchemaToType(params) {
var _a, _b;
let datasquirelSchema;
const { mainShemaJSONFilePath, defaultTableFieldsJSONFilePath } = grabDirNames();
const { mainShemaJSONFilePath, defaultTableFieldsJSONFilePath } = (0, grab_dir_names_1.default)();
if (params === null || params === void 0 ? void 0 : params.dbSchema) {
datasquirelSchema = params.dbSchema;
}
else {
const mainSchema = EJSON.parse(fs.readFileSync(mainShemaJSONFilePath, "utf-8"));
const mainSchema = ejson_1.default.parse(fs_1.default.readFileSync(mainShemaJSONFilePath, "utf-8"));
datasquirelSchema = mainSchema.find((sch) => sch.dbFullName == "datasquirel");
}
if (!datasquirelSchema)
@@ -20,9 +26,9 @@ export default function dbSchemaToType(params) {
let tableNames = `export const DsqlTables = [\n${datasquirelSchema.tables
.map((tbl) => ` "${tbl.tableName}",`)
.join("\n")}\n] as const`;
const defaultFields = EJSON.parse(fs.readFileSync(defaultTableFieldsJSONFilePath, "utf-8"));
const defaultFields = ejson_1.default.parse(fs_1.default.readFileSync(defaultTableFieldsJSONFilePath, "utf-8"));
const dbTablesSchemas = datasquirelSchema.tables.map((tblSchm) => {
let newDefaultFields = _.cloneDeep(defaultFields);
let newDefaultFields = lodash_1.default.cloneDeep(defaultFields);
return Object.assign(Object.assign({}, tblSchm), { fields: tblSchm.fields.find((fld) => fld.fieldName == "id")
? tblSchm.fields
: [
@@ -33,9 +39,9 @@ export default function dbSchemaToType(params) {
] });
});
const defDbName = (_b = (datasquirelSchema.dbName ||
((_a = datasquirelSchema.dbFullName) === null || _a === void 0 ? void 0 : _a.replace(new RegExp(`${AppNames["DsqlDbPrefix"]}\\d+_`), "")))) === null || _b === void 0 ? void 0 : _b.toUpperCase().replace(/ /g, "_");
((_a = datasquirelSchema.dbFullName) === null || _a === void 0 ? void 0 : _a.replace(new RegExp(`${app_names_1.AppNames["DsqlDbPrefix"]}\\d+_`), "")))) === null || _b === void 0 ? void 0 : _b.toUpperCase().replace(/ /g, "_");
const schemas = dbTablesSchemas
.map((table) => generateTypeDefinition({
.map((table) => (0, generate_type_definitions_1.default)({
paradigm: "TypeScript",
table,
typeDefName: `DSQL_${defDbName}_${table.tableName.toUpperCase()}`,
+14 -8
View File
@@ -1,17 +1,23 @@
"use strict";
// @ts-check
import { scryptSync, createDecipheriv } from "crypto";
import { Buffer } from "buffer";
import grabKeys from "../../utils/grab-keys";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.default = decrypt;
const crypto_1 = require("crypto");
const buffer_1 = require("buffer");
const grab_keys_1 = __importDefault(require("../../utils/grab-keys"));
/**
* # Decrypt Function
*/
export default function decrypt({ encryptedString, encryptionKey, encryptionSalt, }) {
function decrypt({ encryptedString, encryptionKey, encryptionSalt, }) {
var _a;
if (!(encryptedString === null || encryptedString === void 0 ? void 0 : encryptedString.match(/./))) {
console.log("Encrypted string is invalid");
return encryptedString;
}
const { key: encrptKey, salt, keyLen, algorithm, bufferAllocSize, } = grabKeys({ encryptionKey });
const { key: encrptKey, salt, keyLen, algorithm, bufferAllocSize, } = (0, grab_keys_1.default)({ encryptionKey });
if (!(encrptKey === null || encrptKey === void 0 ? void 0 : encrptKey.match(/.{8,}/))) {
console.log("Decrption key is invalid");
return encryptedString;
@@ -20,9 +26,9 @@ export default function decrypt({ encryptedString, encryptionKey, encryptionSalt
console.log("Decrption salt is invalid");
return encryptedString;
}
let key = scryptSync(encrptKey, salt, keyLen);
let iv = Buffer.alloc(bufferAllocSize, 0);
const decipher = createDecipheriv(algorithm, key, iv);
let key = (0, crypto_1.scryptSync)(encrptKey, salt, keyLen);
let iv = buffer_1.Buffer.alloc(bufferAllocSize, 0);
const decipher = (0, crypto_1.createDecipheriv)(algorithm, key, iv);
try {
let decrypted = decipher.update(encryptedString, "hex", "utf8");
decrypted += decipher.final("utf8");
@@ -1,7 +1,9 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
/**
* Regular expression to match default fields
*
* @description Regular expression to match default fields
*/
const defaultFieldsRegexp = /^id$|^uuid$|^uid$|^date_created$|^date_created_code$|^date_created_timestamp$|^date_updated$|^date_updated_code$|^date_updated_timestamp$/;
export default defaultFieldsRegexp;
exports.default = defaultFieldsRegexp;
+14 -8
View File
@@ -1,17 +1,23 @@
"use strict";
// @ts-check
import { scryptSync, createCipheriv } from "crypto";
import { Buffer } from "buffer";
import grabKeys from "../../utils/grab-keys";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.default = encrypt;
const crypto_1 = require("crypto");
const buffer_1 = require("buffer");
const grab_keys_1 = __importDefault(require("../../utils/grab-keys"));
/**
* # Encrypt String
*/
export default function encrypt({ data, encryptionKey, encryptionSalt, }) {
function encrypt({ data, encryptionKey, encryptionSalt, }) {
var _a;
if (!(data === null || data === void 0 ? void 0 : data.match(/./))) {
console.log("Encryption string is invalid");
return data;
}
const { key: encrptKey, salt, keyLen, algorithm, bufferAllocSize, } = grabKeys({ encryptionKey });
const { key: encrptKey, salt, keyLen, algorithm, bufferAllocSize, } = (0, grab_keys_1.default)({ encryptionKey });
if (!(encrptKey === null || encrptKey === void 0 ? void 0 : encrptKey.match(/.{8,}/))) {
console.log("Encryption key is invalid");
return data;
@@ -21,9 +27,9 @@ export default function encrypt({ data, encryptionKey, encryptionSalt, }) {
return data;
}
const password = encrptKey;
let key = scryptSync(password, salt, keyLen);
let iv = Buffer.alloc(bufferAllocSize, 0);
const cipher = createCipheriv(algorithm, key, iv);
let key = (0, crypto_1.scryptSync)(password, salt, keyLen);
let iv = buffer_1.Buffer.alloc(bufferAllocSize, 0);
const cipher = (0, crypto_1.createCipheriv)(algorithm, key, iv);
try {
let encrypted = cipher.update(data, "utf8", "hex");
encrypted += cipher.final("hex");
@@ -1,5 +1,11 @@
import defaultFieldsRegexp from "./default-fields-regexp";
export default function generateTypeDefinition({ paradigm, table, query, typeDefName, allValuesOptional, addExport, dbName, }) {
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.default = generateTypeDefinition;
const default_fields_regexp_1 = __importDefault(require("./default-fields-regexp"));
function generateTypeDefinition({ paradigm, table, query, typeDefName, allValuesOptional, addExport, dbName, }) {
let typeDefinition = ``;
try {
const tdName = typeDefName
@@ -37,7 +43,7 @@ export default function generateTypeDefinition({ paradigm, table, query, typeDef
var _a;
const nullValue = allValuesOptional
? "?"
: ((_a = field.fieldName) === null || _a === void 0 ? void 0 : _a.match(defaultFieldsRegexp))
: ((_a = field.fieldName) === null || _a === void 0 ? void 0 : _a.match(default_fields_regexp_1.default))
? "?"
: field.notNullValue
? ""
+11 -5
View File
@@ -1,14 +1,20 @@
import { createHmac } from "crypto";
import grabKeys from "../../utils/grab-keys";
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.default = hashPassword;
const crypto_1 = require("crypto");
const grab_keys_1 = __importDefault(require("../../utils/grab-keys"));
/**
* # Hash password Function
*/
export default function hashPassword({ password, encryptionKey, }) {
const { key } = grabKeys({ encryptionKey });
function hashPassword({ password, encryptionKey, }) {
const { key } = (0, grab_keys_1.default)({ encryptionKey });
if (!(key === null || key === void 0 ? void 0 : key.match(/.{8,}/))) {
throw new Error("Encryption key is invalid");
}
const hmac = createHmac("sha512", key);
const hmac = (0, crypto_1.createHmac)("sha512", key);
hmac.update(password);
let hashed = hmac.digest("base64");
return hashed;
@@ -1,8 +1,14 @@
import sqlEqualityParser from "../../../utils/sql-equality-parser";
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.default = sqlDeleteGenerator;
const sql_equality_parser_1 = __importDefault(require("../../../utils/sql-equality-parser"));
/**
* # SQL Delete Generator
*/
export default function sqlDeleteGenerator({ tableName, deleteKeyValues, dbFullName, data, }) {
function sqlDeleteGenerator({ tableName, deleteKeyValues, dbFullName, data, }) {
const finalDbName = dbFullName ? `${dbFullName}.` : "";
try {
let queryStr = `DELETE FROM ${finalDbName}${tableName}`;
@@ -30,7 +36,7 @@ export default function sqlDeleteGenerator({ tableName, deleteKeyValues, dbFullN
const parsedValue = typeof value == "number" ? String(value) : value;
if (!parsedValue)
return;
const operator = sqlEqualityParser(ky.operator || "EQUAL");
const operator = (0, sql_equality_parser_1.default)(ky.operator || "EQUAL");
deleteBatch.push(`${ky.key} ${operator} ?`);
queryArr.push(parsedValue);
});
@@ -1,9 +1,15 @@
import sqlEqualityParser from "../../../utils/sql-equality-parser";
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.default = sqlGenOperatorGen;
const sql_equality_parser_1 = __importDefault(require("../../../utils/sql-equality-parser"));
/**
* # SQL Gen Operator Gen
* @description Generates an SQL operator for node module `mysql` or `serverless-mysql`
*/
export default function sqlGenOperatorGen({ fieldName, value, equality, }) {
function sqlGenOperatorGen({ fieldName, value, equality, }) {
if (value) {
if (equality == "LIKE") {
return `LOWER(${fieldName}) LIKE LOWER('%${value}%')`;
@@ -27,7 +33,7 @@ export default function sqlGenOperatorGen({ fieldName, value, equality, }) {
return `${fieldName} != ${value}`;
}
else if (equality) {
return `${fieldName} ${sqlEqualityParser(equality)} ${value}`;
return `${fieldName} ${(0, sql_equality_parser_1.default)(equality)} ${value}`;
}
else {
return `${fieldName} = ${value}`;
@@ -41,7 +47,7 @@ export default function sqlGenOperatorGen({ fieldName, value, equality, }) {
return `${fieldName} IS NOT NULL`;
}
else if (equality) {
return `${fieldName} ${sqlEqualityParser(equality)} ?`;
return `${fieldName} ${(0, sql_equality_parser_1.default)(equality)} ?`;
}
else {
return `${fieldName} = ?`;
+9 -3
View File
@@ -1,9 +1,15 @@
import sqlEqualityParser from "../../../utils/sql-equality-parser";
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.default = sqlGenerator;
const sql_equality_parser_1 = __importDefault(require("../../../utils/sql-equality-parser"));
/**
* # SQL Query Generator
* @description Generates an SQL Query for node module `mysql` or `serverless-mysql`
*/
export default function sqlGenerator({ tableName, genObject, dbFullName, count }) {
function sqlGenerator({ tableName, genObject, dbFullName, count }) {
var _a;
const finalQuery = (genObject === null || genObject === void 0 ? void 0 : genObject.query) ? genObject.query : undefined;
const queryKeys = finalQuery ? Object.keys(finalQuery) : undefined;
@@ -32,7 +38,7 @@ export default function sqlGenerator({ tableName, genObject, dbFullName, count }
else if (typeof queryObj.value == "string" ||
typeof queryObj.value == "number") {
const valueParsed = String(queryObj.value);
const operator = sqlEqualityParser(queryObj.equality || "EQUAL");
const operator = (0, sql_equality_parser_1.default)(queryObj.equality || "EQUAL");
if (queryObj.equality == "LIKE") {
str = `LOWER(${finalFieldName}) LIKE LOWER('%${valueParsed}%')`;
}
@@ -1,8 +1,11 @@
"use strict";
// @ts-check
Object.defineProperty(exports, "__esModule", { value: true });
exports.default = sqlInsertGenerator;
/**
* # SQL Insert Generator
*/
export default function sqlInsertGenerator({ tableName, data, dbFullName, }) {
function sqlInsertGenerator({ tableName, data, dbFullName, }) {
const finalDbName = dbFullName ? `${dbFullName}.` : "";
try {
if (Array.isArray(data) && (data === null || data === void 0 ? void 0 : data[0])) {
+79 -59
View File
@@ -1,8 +1,22 @@
import mysql from "mysql";
import { exec } from "child_process";
import { promisify } from "util";
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const mysql_1 = __importDefault(require("mysql"));
const child_process_1 = require("child_process");
const util_1 = require("util");
function getConnection(config) {
return mysql.createConnection(config);
return mysql_1.default.createConnection(config);
}
function getMasterStatus(config) {
return new Promise((resolve, reject) => {
@@ -16,67 +30,73 @@ function getMasterStatus(config) {
});
});
}
async function syncDatabases() {
const config = {
host: "localhost",
user: "root",
password: "your_password",
};
let lastPosition = null; // Track last synced position
while (true) {
try {
// Get current master status
const { File, Position } = await getMasterStatus(config);
// Determine start position (use lastPosition or 4 if first run)
const startPosition = lastPosition !== null ? lastPosition + 1 : 4;
if (startPosition >= Position) {
await new Promise((resolve) => setTimeout(resolve, 5000)); // Wait 5 seconds if no new changes
continue;
}
// Execute mysqlbinlog to get changes
const execPromise = promisify(exec);
const { stdout } = await execPromise(`mysqlbinlog --database=db_master ${File} --start-position=${startPosition} --stop-position=${Position}`);
if (stdout) {
const connection = getConnection(Object.assign(Object.assign({}, config), { database: "db_slave" }));
return new Promise((resolve, reject) => {
connection.query(stdout, (error) => {
connection.end();
if (error)
reject(error);
else {
lastPosition = Position;
console.log(`Synced up to position ${Position} at ${new Date().toISOString()}`);
resolve(null);
}
function syncDatabases() {
return __awaiter(this, void 0, void 0, function* () {
const config = {
host: "localhost",
user: "root",
password: "your_password",
};
let lastPosition = null; // Track last synced position
while (true) {
try {
// Get current master status
const { File, Position } = yield getMasterStatus(config);
// Determine start position (use lastPosition or 4 if first run)
const startPosition = lastPosition !== null ? lastPosition + 1 : 4;
if (startPosition >= Position) {
yield new Promise((resolve) => setTimeout(resolve, 5000)); // Wait 5 seconds if no new changes
continue;
}
// Execute mysqlbinlog to get changes
const execPromise = (0, util_1.promisify)(child_process_1.exec);
const { stdout } = yield execPromise(`mysqlbinlog --database=db_master ${File} --start-position=${startPosition} --stop-position=${Position}`);
if (stdout) {
const connection = getConnection(Object.assign(Object.assign({}, config), { database: "db_slave" }));
return new Promise((resolve, reject) => {
connection.query(stdout, (error) => {
connection.end();
if (error)
reject(error);
else {
lastPosition = Position;
console.log(`Synced up to position ${Position} at ${new Date().toISOString()}`);
resolve(null);
}
});
});
});
}
}
catch (error) {
console.error("Sync error:", error);
}
yield new Promise((resolve) => setTimeout(resolve, 5000)); // Check every 5 seconds
}
catch (error) {
console.error("Sync error:", error);
}
await new Promise((resolve) => setTimeout(resolve, 5000)); // Check every 5 seconds
}
});
}
// Initialize db_slave with db_master data
async function initializeSlave() {
const config = {
host: "localhost",
user: "root",
password: "your_password",
};
try {
await promisify(exec)(`mysqldump -u ${config.user} -p${config.password} db_master > db_master_backup.sql`);
await promisify(exec)(`mysql -u ${config.user} -p${config.password} db_slave < db_master_backup.sql`);
console.log("Slave initialized with master data");
}
catch (error) {
console.error("Initialization error:", error);
}
function initializeSlave() {
return __awaiter(this, void 0, void 0, function* () {
const config = {
host: "localhost",
user: "root",
password: "your_password",
};
try {
yield (0, util_1.promisify)(child_process_1.exec)(`mysqldump -u ${config.user} -p${config.password} db_master > db_master_backup.sql`);
yield (0, util_1.promisify)(child_process_1.exec)(`mysql -u ${config.user} -p${config.password} db_slave < db_master_backup.sql`);
console.log("Slave initialized with master data");
}
catch (error) {
console.error("Initialization error:", error);
}
});
}
// Run the sync process
async function main() {
await initializeSlave();
await syncDatabases();
function main() {
return __awaiter(this, void 0, void 0, function* () {
yield initializeSlave();
yield syncDatabases();
});
}
main().catch(console.error);
@@ -1,5 +1,9 @@
export const TriggerParadigms = ["sync_tables", "sync_dbs"];
export default function grabTriggerName({ userId, paradigm, dbId, tableName, }) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.TriggerParadigms = void 0;
exports.default = grabTriggerName;
exports.TriggerParadigms = ["sync_tables", "sync_dbs"];
function grabTriggerName({ userId, paradigm, dbId, tableName, }) {
let triggerName = `dsql_trig_${paradigm}`;
if (userId)
triggerName += `_${userId}`;
@@ -1,3 +1,6 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.default = triggerSQLGen;
const TriggerTypes = [
{
name: "after_insert",
@@ -12,7 +15,7 @@ const TriggerTypes = [
value: "DELETE",
},
];
export default function triggerSQLGen({ type, srcDbSchema, srcTableSchema, content, proceedureName, }) {
function triggerSQLGen({ type, srcDbSchema, srcTableSchema, content, proceedureName, }) {
let sql = `DELIMITER //\n`;
sql += `CREATE PROCEDURE ${proceedureName}`;
sql += `\nBEGIN`;
@@ -1,5 +1,11 @@
import triggerSQLGen from "./trigger-sql-gen";
export default function tableReplicationTriggerSQLGen({ type, dstDbSchema, dstTableSchema, srcDbSchema, srcTableSchema, userId, paradigm, }) {
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.default = tableReplicationTriggerSQLGen;
const trigger_sql_gen_1 = __importDefault(require("./trigger-sql-gen"));
function tableReplicationTriggerSQLGen({ type, dstDbSchema, dstTableSchema, srcDbSchema, srcTableSchema, userId, paradigm, }) {
let sql = `CREATE TRIGGER`;
const srcColumns = srcTableSchema.fields
.map((fld) => fld.fieldName)
@@ -21,7 +27,7 @@ export default function tableReplicationTriggerSQLGen({ type, dstDbSchema, dstTa
sql += ` DELETE FROM ${dstDbSchema.dbFullName}.${dstTableSchema.tableName}`;
sql += ` WHERE id = OLD.id`;
}
return triggerSQLGen({
return (0, trigger_sql_gen_1.default)({
content: sql,
srcDbSchema,
srcTableSchema,
@@ -1,4 +1,10 @@
import grabTriggerName from "./grab-trigger-name";
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.default = triggerSQLGen;
const grab_trigger_name_1 = __importDefault(require("./grab-trigger-name"));
const TriggerTypes = [
{
name: "after_insert",
@@ -13,9 +19,9 @@ const TriggerTypes = [
value: "DELETE",
},
];
export default function triggerSQLGen({ type, srcDbSchema, srcTableSchema, content, userId, paradigm, }) {
function triggerSQLGen({ type, srcDbSchema, srcTableSchema, content, userId, paradigm, }) {
let sql = `CREATE TRIGGER`;
let triggerName = grabTriggerName({
let triggerName = (0, grab_trigger_name_1.default)({
paradigm,
dbId: srcDbSchema.id,
tableName: srcTableSchema.tableName,