@dbcube/query-builder 3.0.28 → 3.0.30

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/bun.lockb CHANGED
Binary file
package/dist/index.cjs CHANGED
@@ -510,17 +510,20 @@ var Table = class _Table {
510
510
  * console.log(count); // { count: 2 }
511
511
  */
512
512
  async count(column = "*") {
513
- this.dml.type = "select";
514
- this.dml.aggregation = {
515
- type: "COUNT",
516
- column,
517
- alias: "count"
513
+ const executionDML = {
514
+ ...this.dml,
515
+ type: "select",
516
+ aggregation: {
517
+ type: "COUNT",
518
+ column,
519
+ alias: "count"
520
+ },
521
+ columns: [`COUNT(${column}) AS count`],
522
+ data: null,
523
+ limit: 1
518
524
  };
519
- this.dml.columns = [`COUNT(${column}) AS count`];
520
- this.dml.data = null;
521
- this.dml.limit = 1;
522
525
  try {
523
- const result = await this.getResponse();
526
+ const result = await this.getResponse(executionDML);
524
527
  const res = result[0] || null;
525
528
  if (res) {
526
529
  return res.count;
@@ -541,17 +544,20 @@ var Table = class _Table {
541
544
  * console.log(totalAge); // { sum: 55 }
542
545
  */
543
546
  async sum(column) {
544
- this.dml.type = "select";
545
- this.dml.aggregation = {
546
- type: "SUM",
547
- column,
548
- alias: "sum"
547
+ const executionDML = {
548
+ ...this.dml,
549
+ type: "select",
550
+ aggregation: {
551
+ type: "SUM",
552
+ column,
553
+ alias: "sum"
554
+ },
555
+ columns: [`SUM(${column}) AS sum`],
556
+ data: null,
557
+ limit: 1
549
558
  };
550
- this.dml.columns = [`SUM(${column}) AS sum`];
551
- this.dml.data = null;
552
- this.dml.limit = 1;
553
559
  try {
554
- const result = await this.getResponse();
560
+ const result = await this.getResponse(executionDML);
555
561
  const res = result[0] || null;
556
562
  if (res) {
557
563
  return res.sum;
@@ -572,17 +578,20 @@ var Table = class _Table {
572
578
  * console.log(avgAge); // { avg: 27.5 }
573
579
  */
574
580
  async avg(column) {
575
- this.dml.type = "select";
576
- this.dml.aggregation = {
577
- type: "AVG",
578
- column,
579
- alias: "avg"
581
+ const executionDML = {
582
+ ...this.dml,
583
+ type: "select",
584
+ aggregation: {
585
+ type: "AVG",
586
+ column,
587
+ alias: "avg"
588
+ },
589
+ columns: [`AVG(${column}) AS avg`],
590
+ data: null,
591
+ limit: 1
580
592
  };
581
- this.dml.columns = [`AVG(${column}) AS avg`];
582
- this.dml.data = null;
583
- this.dml.limit = 1;
584
593
  try {
585
- const result = await this.getResponse();
594
+ const result = await this.getResponse(executionDML);
586
595
  const res = result[0] || null;
587
596
  if (res) {
588
597
  return res.avg;
@@ -603,17 +612,20 @@ var Table = class _Table {
603
612
  * console.log(maxAge); // { max: 30 }
604
613
  */
605
614
  async max(column) {
606
- this.dml.type = "select";
607
- this.dml.aggregation = {
608
- type: "MAX",
609
- column,
610
- alias: "max"
615
+ const executionDML = {
616
+ ...this.dml,
617
+ type: "select",
618
+ aggregation: {
619
+ type: "MAX",
620
+ column,
621
+ alias: "max"
622
+ },
623
+ columns: [`MAX(${column}) AS max`],
624
+ data: null,
625
+ limit: 1
611
626
  };
612
- this.dml.columns = [`MAX(${column}) AS max`];
613
- this.dml.data = null;
614
- this.dml.limit = 1;
615
627
  try {
616
- const result = await this.getResponse();
628
+ const result = await this.getResponse(executionDML);
617
629
  const res = result[0] || null;
618
630
  if (res) {
619
631
  return res.max;
@@ -634,17 +646,20 @@ var Table = class _Table {
634
646
  * console.log(minAge); // { min: 25 }
635
647
  */
636
648
  async min(column) {
637
- this.dml.type = "select";
638
- this.dml.aggregation = {
639
- type: "MIN",
640
- column,
641
- alias: "min"
649
+ const executionDML = {
650
+ ...this.dml,
651
+ type: "select",
652
+ aggregation: {
653
+ type: "MIN",
654
+ column,
655
+ alias: "min"
656
+ },
657
+ columns: [`MIN(${column}) AS min`],
658
+ data: null,
659
+ limit: 1
642
660
  };
643
- this.dml.columns = [`MIN(${column}) AS min`];
644
- this.dml.data = null;
645
- this.dml.limit = 1;
646
661
  try {
647
- const result = await this.getResponse();
662
+ const result = await this.getResponse(executionDML);
648
663
  const res = result[0] || null;
649
664
  if (res) {
650
665
  return res.min;
@@ -697,9 +712,12 @@ var Table = class _Table {
697
712
  */
698
713
  async get() {
699
714
  try {
700
- this.dml.type = "select";
701
- this.dml.data = null;
702
- const result = await this.getResponse();
715
+ const executionDML = {
716
+ ...this.dml,
717
+ type: "select",
718
+ data: null
719
+ };
720
+ const result = await this.getResponse(executionDML);
703
721
  return result;
704
722
  } catch (error) {
705
723
  throw error;
@@ -715,11 +733,14 @@ var Table = class _Table {
715
733
  * console.log(user); // { id: 1, name: 'John' }
716
734
  */
717
735
  async first() {
718
- this.dml.type = "select";
719
- this.dml.data = null;
720
- this.dml.limit = 1;
736
+ const executionDML = {
737
+ ...this.dml,
738
+ type: "select",
739
+ data: null,
740
+ limit: 1
741
+ };
721
742
  try {
722
- const result = await this.getResponse();
743
+ const result = await this.getResponse(executionDML);
723
744
  return result[0] || null;
724
745
  } catch (error) {
725
746
  throw error;
@@ -737,12 +758,21 @@ var Table = class _Table {
737
758
  * console.log(user); // { id: 1, name: 'John' }
738
759
  */
739
760
  async find(value, column = "id") {
740
- this.dml.type = "select";
741
- this.dml.data = null;
742
- this.where(column, "=", value);
743
- this.dml.limit = 1;
761
+ const executionDML = {
762
+ ...this.dml,
763
+ type: "select",
764
+ data: null,
765
+ where: [...this.dml.where, {
766
+ column,
767
+ operator: "=",
768
+ value,
769
+ type: "AND",
770
+ isGroup: false
771
+ }],
772
+ limit: 1
773
+ };
744
774
  try {
745
- const result = await this.getResponse();
775
+ const result = await this.getResponse(executionDML);
746
776
  return result[0] || null;
747
777
  } catch (error) {
748
778
  throw error;
@@ -768,9 +798,26 @@ var Table = class _Table {
768
798
  if (!data.every((item) => typeof item === "object" && item !== null)) {
769
799
  throw new Error("The array must contain only valid objects.");
770
800
  }
771
- this.dml.type = "insert";
772
- this.dml.data = data;
773
- await this.getResponse(this.dml, "Add");
801
+ const executionDML = {
802
+ ...this.dml,
803
+ type: "insert",
804
+ data
805
+ };
806
+ const result = await this.getResponse(executionDML, "Add");
807
+ if (result && result[0]) {
808
+ if (result[0].inserted_ids !== void 0 && Array.isArray(result[0].inserted_ids)) {
809
+ return data.map((item, index) => ({
810
+ ...item,
811
+ _id: result[0].inserted_ids[index]
812
+ }));
813
+ }
814
+ if (result[0].last_insert_id !== void 0 && data.length === 1) {
815
+ return [{
816
+ ...data[0],
817
+ id: result[0].last_insert_id
818
+ }];
819
+ }
820
+ }
774
821
  return data;
775
822
  }
776
823
  /**
@@ -792,9 +839,12 @@ var Table = class _Table {
792
839
  if (this.dml.where.length === 0) {
793
840
  throw new Error("You must specify at least one WHERE condition to perform an update.");
794
841
  }
795
- this.dml.type = "update";
796
- this.dml.data = data;
797
- await this.getResponse(this.dml, "Update");
842
+ const executionDML = {
843
+ ...this.dml,
844
+ type: "update",
845
+ data
846
+ };
847
+ await this.getResponse(executionDML, "Update");
798
848
  return data;
799
849
  }
800
850
  /**
@@ -810,8 +860,11 @@ var Table = class _Table {
810
860
  if (this.dml.where.length === 0) {
811
861
  throw new Error("You must specify at least one WHERE condition to perform a delete.");
812
862
  }
813
- this.dml.type = "delete";
814
- const deleteData = await this.getResponse(this.dml, "Delete");
863
+ const executionDML = {
864
+ ...this.dml,
865
+ type: "delete"
866
+ };
867
+ const deleteData = await this.getResponse(executionDML, "Delete");
815
868
  return deleteData;
816
869
  }
817
870
  async getResponse(dml = null, type = null) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/lib/Database.ts","../src/lib/Trigger.ts"],"sourcesContent":["import { Table, Database } from './lib/Database';\r\nimport type { DatabaseRecord, WhereCallback } from './@types/Database';\r\n\r\nexport default Database;\r\nexport { \r\n Table, \r\n Database,\r\n type DatabaseRecord,\r\n type WhereCallback\r\n};","import fs from 'fs';\r\nimport { QueryEngine, ComputedFieldProcessor, TriggerProcessor } from \"@dbcube/core\";\r\nimport { DatabaseRecord, DML, WhereCallback, WhereCondition } from \"../@types/Database\";\r\nimport { Trigger } from './Trigger';\r\n\r\n/**\r\n * Main class to handle MySQL database connections and queries.\r\n * Implements the Singleton pattern to ensure a single instance of the connection pool.\r\n */\r\nexport class Database {\r\n private name: string;\r\n private engine: any;\r\n private computedFields: any[];\r\n private triggers: any[];\r\n\r\n constructor(name: string) {\r\n this.name = name;\r\n const engine = new QueryEngine(name);\r\n this.engine = engine;\r\n this.computedFields = [];\r\n this.triggers = [];\r\n }\r\n\r\n async useComputes(): Promise<Database> {\r\n const newDatabase = new Database(this.name); \r\n const arrayComputedFields = await ComputedFieldProcessor.getComputedFields(this.name);\r\n newDatabase.setComputedFields(arrayComputedFields);\r\n return newDatabase;\r\n }\r\n\r\n async useTriggers(): Promise<Database> {\r\n const newDatabase = new Database(this.name); \r\n const arrayTriggers = await TriggerProcessor.getTriggers(this.name);\r\n newDatabase.setTriggers(arrayTriggers);\r\n return newDatabase;\r\n }\r\n\r\n async connect(): Promise<void> {\r\n const response = await this.engine.run('query_engine', [\r\n '--action', 'connect',\r\n ]);\r\n if (response.status != 200) {\r\n returnFormattedError(response.status, response.message);\r\n }\r\n return response.data;\r\n }\r\n\r\n async disconnect(): Promise<void> {\r\n return this.engine.run('query_engine', [\r\n '--action', 'disconnect',\r\n ]);\r\n }\r\n\r\n /**\r\n * Creates and returns a new instance of `Table` for the specified table.\r\n * This method is used to start building queries for a specific table.\r\n * It provides a fluent interface for common database operations like select, insert, update, and delete.\r\n *\r\n * @param {string} tableName - The name of the table to query.\r\n * @returns {Table} - Returns a new instance of `Table` for the specified table.\r\n *\r\n * @example\r\n * // Select all records from a table\r\n * const users = await db.table('users').get();\r\n * \r\n * // Select records with conditions\r\n * const activeUsers = await db.table('users')\r\n * .where('status', '=', 'active')\r\n * .orderBy('created_at', 'DESC')\r\n * .limit(10)\r\n * .get();\r\n * \r\n * // Insert records\r\n * await db.table('users').insert([\r\n * { name: 'John', email: 'john@example.com', age: 30 }\r\n * ]);\r\n * \r\n * // Update records\r\n * await db.table('users')\r\n * .where('id', '=', 1)\r\n * .update({ status: 'inactive' });\r\n * \r\n * // Delete records\r\n * await db.table('users')\r\n * .where('status', '=', 'deleted')\r\n * .delete();\r\n * \r\n * // Access column management\r\n * const columns = await db.table('users').columns().get();\r\n */\r\n table(tableName: string): Table {\r\n return new Table(this, this.name, tableName, this.engine, this.computedFields, this.triggers);\r\n }\r\n\r\n private setComputedFields(computedFields: any[]){\r\n this.computedFields = computedFields;\r\n }\r\n\r\n private setTriggers(triggers: any[]){\r\n this.triggers = triggers;\r\n }\r\n}\r\n\r\n/**\r\n * Class to build and execute SQL queries for a specific table.\r\n * Supports operations like SELECT, INSERT, UPDATE, DELETE, and more.\r\n */\r\nexport class Table {\r\n private engine: any;\r\n private nextType: 'AND' | 'OR' = 'AND';\r\n private dml: DML;\r\n private computedFields: any[] = [];\r\n private trigger: any;\r\n private triggers: any;\r\n\r\n constructor(instance: any, databaseName: string, tableName: string, engine: any = null, computedFields: any[] = [], triggers: any[] = []) {\r\n this.engine = engine;\r\n this.computedFields = computedFields;\r\n this.triggers = triggers;\r\n this.trigger = new Trigger(instance, databaseName, triggers);\r\n this.nextType = 'AND';\r\n\r\n this.dml = {\r\n type: 'select',\r\n database: databaseName,\r\n table: tableName,\r\n columns: ['*'],\r\n distinct: false,\r\n joins: [],\r\n where: [],\r\n orderBy: [],\r\n groupBy: [],\r\n limit: null,\r\n offset: null,\r\n data: null,\r\n aggregation: null\r\n };\r\n }\r\n\r\n /**\r\n * Specifies the columns to select in a SELECT query.\r\n *\r\n * @param {string[]} fields - Array of column names to select. If empty, selects all columns.\r\n * @returns {Table} - Returns the current instance of Table for method chaining.\r\n *\r\n * @example\r\n * const users = await db.table('users').select(['id', 'name']).get();\r\n * console.log(users); // [{ id: 1, name: 'John' }, { id: 2, name: 'Jane' }]\r\n */\r\n select(fields: string[] = []): Table {\r\n const clone = this.clone();\r\n clone.dml.type = 'select';\r\n clone.dml.columns = fields.length > 0 ? fields : ['*'];\r\n return clone;\r\n }\r\n\r\n /**\r\n * Adds a WHERE condition to the query.\r\n *\r\n * @param {string} column - The column to filter by.\r\n * @param {string} operator - The comparison operator (e.g., '=', '>', '<', 'IS NULL', 'IS NOT NULL').\r\n * @param {any} value - The value to compare against (optional for IS NULL/IS NOT NULL).\r\n * @returns {Table} - Returns the current instance of Table for method chaining.\r\n *\r\n * @example\r\n * const users = await db.table('users').where('age', '>', 25).get();\r\n * const nullUsers = await db.table('users').where('email', 'IS NULL').get();\r\n * console.log(users); // [{ id: 1, name: 'John', age: 30 }]\r\n */\r\n where(column: string, operator: 'IS NULL' | 'IS NOT NULL'): Table;\r\n where(column: string, operator: '=' | '!=' | '<>' | '>' | '<' | '>=' | '<=' | 'LIKE' | 'NOT LIKE' | 'IN' | 'NOT IN' | 'BETWEEN' | 'NOT BETWEEN', value: any): Table;\r\n where(column: string, operator: string, value?: any): Table {\r\n const clone = this.clone();\r\n clone.dml.where.push({\r\n column,\r\n operator,\r\n value,\r\n type: clone.nextType,\r\n isGroup: false\r\n });\r\n clone.nextType = 'AND';\r\n return clone;\r\n }\r\n\r\n /**\r\n * Adds an OR WHERE condition to the query.\r\n *\r\n * @param {string} column - The column to filter by.\r\n * @param {string} operator - The comparison operator (e.g., '=', '>', '<', 'IS NULL', 'IS NOT NULL').\r\n * @param {any} value - The value to compare against (optional for IS NULL/IS NOT NULL).\r\n * @returns {Table} - Returns the current instance of Table for method chaining.\r\n *\r\n * @example\r\n * const users = await db.table('users').where('age', '>', 25).orWhere('name', '=', 'Jane').get();\r\n * const nullUsers = await db.table('users').where('active', '=', true).orWhere('email', 'IS NULL').get();\r\n * console.log(users); // [{ id: 1, name: 'John', age: 30 }, { id: 2, name: 'Jane', age: 25 }]\r\n */\r\n orWhere(column: string, operator: 'IS NULL' | 'IS NOT NULL'): Table;\r\n orWhere(column: string, operator: '=' | '!=' | '<>' | '>' | '<' | '>=' | '<=' | 'LIKE' | 'NOT LIKE' | 'IN' | 'NOT IN' | 'BETWEEN' | 'NOT BETWEEN', value: any): Table;\r\n orWhere(column: string, operator: string, value?: any): Table {\r\n const clone = this.clone();\r\n clone.dml.where.push({\r\n column,\r\n operator,\r\n value,\r\n type: 'OR',\r\n isGroup: false\r\n });\r\n return clone;\r\n }\r\n\r\n /**\r\n * Adds a grouped WHERE condition to the query.\r\n *\r\n * @param {WhereCallback} callback - A callback function that receives a new Table instance to build the grouped conditions.\r\n * @returns {Table} - Returns the current instance of Table for method chaining.\r\n *\r\n * @example\r\n * const users = await db.table('users').whereGroup(query => {\r\n * query.where('age', '>', 25).orWhere('name', '=', 'Jane');\r\n * }).get();\r\n * console.log(users); // [{ id: 1, name: 'John', age: 30 }, { id: 2, name: 'Jane', age: 25 }]\r\n */\r\n whereGroup(callback: WhereCallback): Table {\r\n const clone = this.clone();\r\n const groupQuery = new Table(clone.dml.database, clone.dml.table, clone.engine);\r\n callback(groupQuery);\r\n\r\n clone.dml.where.push({\r\n type: clone.nextType,\r\n isGroup: true,\r\n conditions: groupQuery.dml.where as WhereCondition[]\r\n });\r\n clone.nextType = 'AND';\r\n return clone;\r\n }\r\n\r\n or(): Table {\r\n const clone = this.clone();\r\n clone.nextType = 'OR';\r\n return clone;\r\n }\r\n\r\n and(): Table {\r\n const clone = this.clone();\r\n clone.nextType = 'AND';\r\n return clone;\r\n }\r\n\r\n /**\r\n * Adds a WHERE BETWEEN condition to the query.\r\n *\r\n * @param {string} column - The column to filter by.\r\n * @param {[any, any]} values - A tuple with two values representing the range.\r\n * @returns {Table} - Returns the current instance of Table for method chaining.\r\n *\r\n * @example\r\n * const users = await db.table('users').whereBetween('age', [20, 30]).get();\r\n * console.log(users); // [{ id: 1, name: 'John', age: 30 }, { id: 2, name: 'Jane', age: 25 }]\r\n */\r\n whereBetween(column: string, values: [any, any]): Table {\r\n const clone = this.clone();\r\n const [value1, value2] = values;\r\n if (value1 !== undefined && value2 !== undefined) {\r\n clone.dml.where.push({\r\n column,\r\n operator: 'BETWEEN',\r\n value: [value1, value2],\r\n type: clone.nextType,\r\n isGroup: false\r\n });\r\n clone.nextType = 'AND';\r\n }\r\n return clone;\r\n }\r\n\r\n /**\r\n * Adds a WHERE IN condition to the query.\r\n *\r\n * @param {string} column - The column to filter by.\r\n * @param {any[]} values - An array of values to match.\r\n * @returns {Table} - Returns the current instance of Table for method chaining.\r\n *\r\n * @example\r\n * const users = await db.table('users').whereIn('id', [1, 2]).get();\r\n * console.log(users); // [{ id: 1, name: 'John' }, { id: 2, name: 'Jane' }]\r\n */\r\n whereIn(column: string, values: any[]): Table {\r\n const clone = this.clone();\r\n if (Array.isArray(values) && values.length > 0) {\r\n clone.dml.where.push({\r\n column,\r\n operator: 'IN',\r\n value: values,\r\n type: clone.nextType,\r\n isGroup: false\r\n });\r\n clone.nextType = 'AND';\r\n }\r\n return clone;\r\n }\r\n\r\n /**\r\n * Adds a WHERE IS NULL condition to the query.\r\n *\r\n * @param {string} column - The column to filter by.\r\n * @returns {Table} - Returns the current instance of Table for method chaining.\r\n *\r\n * @example\r\n * const users = await db.table('users').whereNull('email').get();\r\n * console.log(users); // [{ id: 3, name: 'Alice', email: null }]\r\n */\r\n whereNull(column: string): Table {\r\n const clone = this.clone();\r\n clone.dml.where.push({\r\n column,\r\n operator: 'IS NULL',\r\n type: clone.nextType,\r\n isGroup: false\r\n });\r\n clone.nextType = 'AND';\r\n return clone;\r\n }\r\n\r\n /**\r\n * Adds a WHERE IS NOT NULL condition to the query.\r\n *\r\n * @param {string} column - The column to filter by.\r\n * @returns {Table} - Returns the current instance of Table for method chaining.\r\n *\r\n * @example\r\n * const users = await db.table('users').whereNotNull('email').get();\r\n * console.log(users); // [{ id: 1, name: 'John', email: 'john@example.com' }]\r\n */\r\n whereNotNull(column: string): Table {\r\n const clone = this.clone();\r\n clone.dml.where.push({\r\n column,\r\n operator: 'IS NOT NULL',\r\n type: clone.nextType,\r\n isGroup: false\r\n });\r\n clone.nextType = 'AND';\r\n return clone;\r\n }\r\n\r\n /**\r\n * Adds a JOIN clause to the query.\r\n *\r\n * @param {string} table - The table to join.\r\n * @param {string} column1 - The column from the current table.\r\n * @param {string} operator - The comparison operator (e.g., '=', '>', '<').\r\n * @param {string} column2 - The column from the joined table.\r\n * @returns {Table} - Returns the current instance of Table for method chaining.\r\n *\r\n * @example\r\n * const users = await db.table('users').join('orders', 'users.id', '=', 'orders.user_id').get();\r\n * console.log(users); // [{ id: 1, name: 'John', order_id: 101 }]\r\n */\r\n join(table: string, column1: string, operator: string, column2: string): Table {\r\n const clone = this.clone();\r\n clone.dml.joins.push({\r\n type: 'INNER',\r\n table,\r\n on: {\r\n column1,\r\n operator,\r\n column2\r\n }\r\n });\r\n return clone;\r\n }\r\n\r\n /**\r\n * Adds a LEFT JOIN clause to the query.\r\n *\r\n * @param {string} table - The table to join.\r\n * @param {string} column1 - The column from the current table.\r\n * @param {string} operator - The comparison operator (e.g., '=', '>', '<').\r\n * @param {string} column2 - The column from the joined table.\r\n * @returns {Table} - Returns the current instance of Table for method chaining.\r\n *\r\n * @example\r\n * const users = await db.table('users').leftJoin('orders', 'users.id', '=', 'orders.user_id').get();\r\n * console.log(users); // [{ id: 1, name: 'John', order_id: 101 }, { id: 2, name: 'Jane', order_id: null }]\r\n */\r\n leftJoin(table: string, column1: string, operator: string, column2: string): Table {\r\n const clone = this.clone();\r\n clone.dml.joins.push({\r\n type: 'LEFT',\r\n table,\r\n on: {\r\n column1,\r\n operator,\r\n column2\r\n }\r\n });\r\n return clone;\r\n }\r\n\r\n /**\r\n * Adds a RIGHT JOIN clause to the query.\r\n *\r\n * @param {string} table - The table to join.\r\n * @param {string} column1 - The column from the current table.\r\n * @param {string} operator - The comparison operator (e.g., '=', '>', '<').\r\n * @param {string} column2 - The column from the joined table.\r\n * @returns {Table} - Returns the current instance of Table for method chaining.\r\n *\r\n * @example\r\n * const users = await db.table('users').rightJoin('orders', 'users.id', '=', 'orders.user_id').get();\r\n * console.log(users); // [{ id: 1, name: 'John', order_id: 101 }, { id: null, name: null, order_id: 102 }]\r\n */\r\n rightJoin(table: string, column1: string, operator: string, column2: string): Table {\r\n const clone = this.clone();\r\n clone.dml.joins.push({\r\n type: 'RIGHT',\r\n table,\r\n on: {\r\n column1,\r\n operator,\r\n column2\r\n }\r\n });\r\n return clone;\r\n }\r\n\r\n /**\r\n * Adds an ORDER BY clause to the query.\r\n *\r\n * @param {string} column - The column to order by.\r\n * @param {'ASC' | 'DESC'} direction - The sorting direction ('ASC' or 'DESC').\r\n * @returns {Table} - Returns the current instance of Table for method chaining.\r\n *\r\n * @example\r\n * const users = await db.table('users').orderBy('name', 'ASC').get();\r\n * console.log(users); // [{ id: 2, name: 'Jane' }, { id: 1, name: 'John' }]\r\n */\r\n orderBy(column: string, direction: 'ASC' | 'DESC' = 'ASC'): Table {\r\n const clone = this.clone();\r\n const validDirections: ('ASC' | 'DESC')[] = ['ASC', 'DESC'];\r\n if (validDirections.includes(direction.toUpperCase() as 'ASC' | 'DESC')) {\r\n clone.dml.orderBy.push({\r\n column,\r\n direction: direction.toUpperCase() as 'ASC' | 'DESC'\r\n });\r\n } else {\r\n throw new Error(`Invalid direction: ${direction}. Use 'ASC' or 'DESC'.`);\r\n }\r\n return clone;\r\n }\r\n\r\n /**\r\n * Adds a GROUP BY clause to the query.\r\n *\r\n * @param {string} column - The column to group by.\r\n * @returns {Table} - Returns the current instance of Table for method chaining.\r\n *\r\n * @example\r\n * const users = await db.table('users').groupBy('age').get();\r\n * console.log(users); // [{ age: 30, count: 1 }, { age: 25, count: 1 }]\r\n */\r\n groupBy(column: string): Table {\r\n const clone = this.clone();\r\n clone.dml.groupBy.push(column);\r\n return clone;\r\n }\r\n\r\n /**\r\n * Adds a DISTINCT clause to the query.\r\n *\r\n * @returns {Table} - Returns the current instance of Table for method chaining.\r\n *\r\n * @example\r\n * const users = await db.table('users').distinct().select(['name']).get();\r\n * console.log(users); // [{ name: 'John' }, { name: 'Jane' }]\r\n */\r\n distinct(): Table {\r\n const clone = this.clone();\r\n clone.dml.distinct = true;\r\n return clone;\r\n }\r\n\r\n /**\r\n * Adds a COUNT clause to the query.\r\n *\r\n * @param {string} column - The column to count (default is '*').\r\n * @returns {Table} - Returns the current instance of Table for method chaining.\r\n *\r\n * @example\r\n * const count = await db.table('users').count().first();\r\n * console.log(count); // { count: 2 }\r\n */\r\n async count(column: string = '*'): Promise<Number> {\r\n this.dml.type = 'select';\r\n this.dml.aggregation = {\r\n type: 'COUNT',\r\n column,\r\n alias: 'count'\r\n };\r\n this.dml.columns = [`COUNT(${column}) AS count`];\r\n this.dml.data = null;\r\n this.dml.limit = 1;\r\n try {\r\n const result = await this.getResponse();\r\n const res = result[0] || null;\r\n if(res){\r\n return res.count;\r\n }\r\n return 0;\r\n }\r\n catch (error) {\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Adds a SUM clause to the query.\r\n *\r\n * @param {string} column - The column to sum.\r\n * @returns {Table} - Returns the current instance of Table for method chaining.\r\n *\r\n * @example\r\n * const totalAge = await db.table('users').sum('age').first();\r\n * console.log(totalAge); // { sum: 55 }\r\n */\r\n async sum(column: string): Promise<Number> {\r\n this.dml.type = 'select';\r\n this.dml.aggregation = {\r\n type: 'SUM',\r\n column,\r\n alias: 'sum'\r\n };\r\n this.dml.columns = [`SUM(${column}) AS sum`];\r\n this.dml.data = null;\r\n this.dml.limit = 1;\r\n try {\r\n const result = await this.getResponse();\r\n const res = result[0] || null;\r\n if(res){\r\n return res.sum;\r\n }\r\n return 0;\r\n }\r\n catch (error) {\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Adds an AVG clause to the query.\r\n *\r\n * @param {string} column - The column to calculate the average.\r\n * @returns {Table} - Returns the current instance of Table for method chaining.\r\n *\r\n * @example\r\n * const avgAge = await db.table('users').avg('age').first();\r\n * console.log(avgAge); // { avg: 27.5 }\r\n */\r\n async avg(column: string): Promise<Number> {\r\n this.dml.type = 'select';\r\n this.dml.aggregation = {\r\n type: 'AVG',\r\n column,\r\n alias: 'avg'\r\n };\r\n this.dml.columns = [`AVG(${column}) AS avg`];\r\n this.dml.data = null;\r\n this.dml.limit = 1;\r\n try {\r\n const result = await this.getResponse();\r\n const res = result[0] || null;\r\n if(res){\r\n return res.avg;\r\n }\r\n return 0;\r\n }\r\n catch (error) {\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Adds a MAX clause to the query.\r\n *\r\n * @param {string} column - The column to find the maximum value.\r\n * @returns {Table} - Returns the current instance of Table for method chaining.\r\n *\r\n * @example\r\n * const maxAge = await db.table('users').max('age').first();\r\n * console.log(maxAge); // { max: 30 }\r\n */\r\n async max(column: string): Promise<Number> {\r\n this.dml.type = 'select';\r\n this.dml.aggregation = {\r\n type: 'MAX',\r\n column,\r\n alias: 'max'\r\n };\r\n this.dml.columns = [`MAX(${column}) AS max`];\r\n this.dml.data = null;\r\n this.dml.limit = 1;\r\n try {\r\n const result = await this.getResponse();\r\n const res = result[0] || null;\r\n if(res){\r\n return res.max;\r\n }\r\n return 0;\r\n }\r\n catch (error) {\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Adds a MIN clause to the query.\r\n *\r\n * @param {string} column - The column to find the minimum value.\r\n * @returns {Table} - Returns the current instance of Table for method chaining.\r\n *\r\n * @example\r\n * const minAge = await db.table('users').min('age').first();\r\n * console.log(minAge); // { min: 25 }\r\n */\r\n async min(column: string): Promise<Number> {\r\n this.dml.type = 'select';\r\n this.dml.aggregation = {\r\n type: 'MIN',\r\n column,\r\n alias: 'min'\r\n };\r\n this.dml.columns = [`MIN(${column}) AS min`];\r\n this.dml.data = null;\r\n this.dml.limit = 1;\r\n try {\r\n const result = await this.getResponse();\r\n const res = result[0] || null;\r\n if(res){\r\n return res.min;\r\n }\r\n return 0;\r\n }\r\n catch (error) {\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Adds a LIMIT clause to the query.\r\n *\r\n * @param {number} number - The maximum number of rows to return.\r\n * @returns {Table} - Returns the current instance of Table for method chaining.\r\n *\r\n * @example\r\n * const users = await db.table('users').limit(1).get();\r\n * console.log(users); // [{ id: 1, name: 'John', age: 30 }]\r\n */\r\n limit(number: number): Table {\r\n const clone = this.clone();\r\n clone.dml.limit = number;\r\n return clone;\r\n }\r\n\r\n /**\r\n * Adds pagination to the query using LIMIT and OFFSET.\r\n *\r\n * @param {number} number - The page number (starting from 1).\r\n * @returns {Table} - Returns the current instance of Table for method chaining.\r\n *\r\n * @example\r\n * const users = await db.table('users').limit(1).page(2).get();\r\n * console.log(users); // [{ id: 2, name: 'Jane', age: 25 }]\r\n */\r\n page(number: number): Table {\r\n const clone = this.clone();\r\n if (clone.dml.limit) {\r\n clone.dml.offset = (number - 1) * clone.dml.limit;\r\n }\r\n return clone;\r\n }\r\n\r\n /**\r\n * Executes the query and returns all matching rows.\r\n *\r\n * @returns {Promise<DatabaseRecord[]>} - Returns an array of rows.\r\n *\r\n * @example\r\n * const users = await db.table('users').get();\r\n * console.log(users); // [{ id: 1, name: 'John' }, { id: 2, name: 'Jane' }]\r\n */\r\n async get(): Promise<DatabaseRecord[]> {\r\n try {\r\n this.dml.type = 'select';\r\n this.dml.data = null;\r\n const result = await this.getResponse();\r\n return result;\r\n }\r\n catch (error) {\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Executes the query and returns the first matching row.\r\n *\r\n * @returns {Promise<DatabaseRecord | null>} - Returns the first row or null if no rows match.\r\n *\r\n * @example\r\n * const user = await db.table('users').first();\r\n * console.log(user); // { id: 1, name: 'John' }\r\n */\r\n async first(): Promise<DatabaseRecord | null> {\r\n this.dml.type = 'select';\r\n this.dml.data = null;\r\n this.dml.limit = 1;\r\n try {\r\n const result = await this.getResponse();\r\n return result[0] || null;\r\n }\r\n catch (error) {\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Finds a row by a specific column value.\r\n *\r\n * @param {any} value - The value to search for.\r\n * @param {string} column - The column to search in (default is 'id').\r\n * @returns {Promise<DatabaseRecord | null>} - Returns the first matching row or null if no rows match.\r\n *\r\n * @example\r\n * const user = await db.table('users').find(1);\r\n * console.log(user); // { id: 1, name: 'John' }\r\n */\r\n async find(value: any, column: string = 'id'): Promise<DatabaseRecord | null> {\r\n this.dml.type = 'select';\r\n this.dml.data = null;\r\n this.where(column, '=', value);\r\n this.dml.limit = 1;\r\n try {\r\n const result = await this.getResponse();\r\n return result[0] || null;\r\n }\r\n catch (error) {\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Inserts one or more rows into the table.\r\n *\r\n * @param {DatabaseRecord[]} data - An array of objects representing the rows to insert.\r\n * @returns {Promise<DatabaseRecord[]>} - Returns an array of the inserted rows.\r\n *\r\n * @example\r\n * const newUsers = await db.table('users').insert([\r\n * { name: 'Alice', age: 28 },\r\n * { name: 'Bob', age: 32 }\r\n * ]);\r\n * console.log(newUsers); // [{ id: 3, name: 'Alice', age: 28 }, { id: 4, name: 'Bob', age: 32 }]\r\n */\r\n async insert(data: DatabaseRecord[]): Promise<DatabaseRecord[]> {\r\n if (!Array.isArray(data)) {\r\n throw new Error('The insert method requires an array of objects with key-value pairs.');\r\n }\r\n\r\n if (!data.every(item => typeof item === 'object' && item !== null)) {\r\n throw new Error('The array must contain only valid objects.');\r\n }\r\n\r\n this.dml.type = 'insert';\r\n this.dml.data = data;\r\n\r\n await this.getResponse(this.dml, 'Add');\r\n\r\n return data;\r\n }\r\n\r\n /**\r\n * Updates rows in the table based on the defined conditions.\r\n *\r\n * @param {DatabaseRecord} data - An object with key-value pairs representing the fields to update.\r\n * @returns {Promise<any>} - Returns the result of the update operation.\r\n *\r\n * @example\r\n * const result = await db.table('users')\r\n * .where('id', '=', 1)\r\n * .update({ name: 'John Updated', age: 31 });\r\n * console.log(result); // { affectedRows: 1 }\r\n */\r\n async update(data: DatabaseRecord): Promise<any> {\r\n if (typeof data !== 'object' || Array.isArray(data)) {\r\n throw new Error('The update method requires an object with key-value pairs.');\r\n }\r\n\r\n if (this.dml.where.length === 0) {\r\n throw new Error('You must specify at least one WHERE condition to perform an update.');\r\n }\r\n\r\n this.dml.type = 'update';\r\n this.dml.data = data;\r\n\r\n await this.getResponse(this.dml, 'Update');\r\n\r\n return data;\r\n }\r\n\r\n /**\r\n * Deletes rows from the table based on the defined conditions.\r\n *\r\n * @returns {Promise<any>} - Returns the result of the delete operation.\r\n *\r\n * @example\r\n * const result = await db.table('users').where('id', '=', 1).delete();\r\n * console.log(result); // { affectedRows: 1 }\r\n */\r\n async delete(): Promise<any> {\r\n if (this.dml.where.length === 0) {\r\n throw new Error('You must specify at least one WHERE condition to perform a delete.');\r\n }\r\n\r\n this.dml.type = 'delete';\r\n\r\n const deleteData = await this.getResponse(this.dml, 'Delete');\r\n return deleteData;\r\n }\r\n\r\n private async getResponse(dml: any = null, type: any = null): Promise<any> {\r\n const localDML = dml ? dml : this.dml;\r\n const computedFieldsNeeded: any[] = [];\r\n let dependeciesArrray: any[] = [];\r\n\r\n if (this.computedFields.length > 0) {\r\n let columns = localDML.columns;\r\n\r\n for (const field of localDML.columns) {\r\n const computedField = this.computedFields.find(cf => cf.column === field);\r\n\r\n if (computedField) {\r\n computedFieldsNeeded.push(computedField);\r\n // Add dependencies to real fields\r\n const dependencies = ComputedFieldProcessor.extractDependencies(computedField.instruction);\r\n dependeciesArrray = [...dependeciesArrray, ...dependencies];\r\n columns = Array.from(new Set([...columns, ...dependencies]));\r\n columns = columns.filter((col: string) => col != field);\r\n }\r\n }\r\n localDML.columns = columns;\r\n }\r\n\r\n let arrayResult = [];\r\n if (type) {\r\n const beffore = this.trigger.get('before' + type);\r\n const after = this.trigger.get('after' + type);\r\n if (this.triggers.length > 0 && (beffore || after)) {\r\n const dataset = localDML.data;\r\n for (let index = 0; index < dataset.length; index++) {\r\n const data = dataset[index];\r\n const newDML = { ...localDML, data: [data] };\r\n if (beffore) {\r\n const interceptor = await this.trigger.execute('before' + type, data);\r\n const response = await this.engine.run('query_engine', [\r\n '--action', 'execute',\r\n '--dml', JSON.stringify(newDML)\r\n ]);\r\n\r\n if (response.status != 200) {\r\n interceptor.discard();\r\n returnFormattedError(response.status, response.message);\r\n }\r\n await interceptor.commit();\r\n arrayResult = response.data;\r\n }\r\n if (after) {\r\n\r\n const response = await this.engine.run('query_engine', [\r\n '--action', 'execute',\r\n '--dml', JSON.stringify(newDML)\r\n ]);\r\n\r\n if (response.status != 200) {\r\n returnFormattedError(response.status, response.message);\r\n }\r\n const interceptor = await this.trigger.execute('after' + type, data);\r\n await interceptor.commit();\r\n }\r\n }\r\n } else {\r\n const response = await this.engine.run('query_engine', [\r\n '--action', 'execute',\r\n '--dml', JSON.stringify(localDML)\r\n ]);\r\n\r\n if (response.status != 200) {\r\n returnFormattedError(response.status, response.message);\r\n }\r\n\r\n arrayResult = response.data;\r\n }\r\n } else {\r\n const response = await this.engine.run('query_engine', [\r\n '--action', 'execute',\r\n '--dml', JSON.stringify(localDML)\r\n ]);\r\n\r\n if (response.status != 200) {\r\n returnFormattedError(response.status, response.message);\r\n }\r\n\r\n arrayResult = response.data;\r\n }\r\n\r\n if (computedFieldsNeeded.length > 0) {\r\n let newDataset: any = ComputedFieldProcessor.computedFields(arrayResult, computedFieldsNeeded);\r\n const result = newDataset.map((obj: any) => {\r\n const newObj = { ...obj };\r\n dependeciesArrray.forEach(key => delete newObj[key]);\r\n return newObj;\r\n });\r\n return result;\r\n }\r\n\r\n return arrayResult;\r\n }\r\n\r\n private clone(): Table {\r\n const cloned = Object.create(Object.getPrototypeOf(this));\r\n cloned.engine = this.engine;\r\n cloned.nextType = this.nextType;\r\n cloned.computedFields = this.computedFields;\r\n cloned.trigger = this.trigger;\r\n cloned.triggers = this.triggers;\r\n cloned.dml = {\r\n ...this.dml,\r\n columns: [...this.dml.columns],\r\n joins: [...this.dml.joins],\r\n where: [...this.dml.where],\r\n orderBy: [...this.dml.orderBy],\r\n groupBy: [...this.dml.groupBy]\r\n };\r\n return cloned;\r\n }\r\n\r\n}\r\n\r\nfunction returnFormattedError(status: number, message: string) {\r\n const RESET = '\\x1b[0m';\r\n const RED = '\\x1b[31m';\r\n const YELLOW = '\\x1b[33m';\r\n const BOLD = '\\x1b[1m';\r\n const CYAN = '\\x1b[36m';\r\n const GRAY = '\\x1b[90m';\r\n const UNDERLINE = '\\x1b[4m';\r\n const MAGENTA = '\\x1b[35m';\r\n\r\n let output = '';\r\n let help = '';\r\n const color = status === 600 ? YELLOW : RED;\r\n\r\n\r\n if (message.includes(\"[help]\")) {\r\n const parts = message.split(\"[help]\");\r\n output += `\\n${RED}${BOLD}${parts[0]}${RESET}`;\r\n help += `\\n${MAGENTA}${BOLD}[help]${RESET} ${GRAY}${parts[1]}${RESET}\\n`;\r\n } else {\r\n output += `\\n${color}${BOLD}${message}${RESET}\\n`;\r\n }\r\n\r\n const err = new Error();\r\n const stackLines = err.stack?.split('\\n') || [];\r\n\r\n // Buscamos la primera línea del stack fuera de node_modules\r\n const relevantStackLine = stackLines.find(line =>\r\n line.includes('.js:') && !line.includes('node_modules')\r\n );\r\n\r\n if (relevantStackLine) {\r\n const match = relevantStackLine.match(/\\((.*):(\\d+):(\\d+)\\)/) ||\r\n relevantStackLine.match(/at (.*):(\\d+):(\\d+)/);\r\n\r\n if (match) {\r\n const [, filePath, lineStr, columnStr] = match;\r\n const lineNum = parseInt(lineStr, 10);\r\n const errorLocation = `${filePath}:${lineStr}:${columnStr}`;\r\n\r\n // Leemos el archivo y sacamos las líneas relevantes\r\n try {\r\n const codeLines = fs.readFileSync(filePath, 'utf-8').split('\\n');\r\n const start = Math.max(0, lineNum - 3);\r\n const end = Math.min(codeLines.length, lineNum + 2);\r\n\r\n output += `\\n${CYAN}${BOLD}[code] ${RESET}${YELLOW} ${UNDERLINE}${errorLocation}${RESET}\\n`;\r\n\r\n for (let i = start; i < end; i++) {\r\n const line = codeLines[i];\r\n const lineLabel = `${i + 1}`.padStart(4, ' ');\r\n const pointer = i + 1 === lineNum ? `${RED}<-${RESET}` : ' ';\r\n output += `${GRAY}${lineLabel}${RESET} ${pointer} ${line}\\n`;\r\n }\r\n } catch (err) {\r\n output += `${YELLOW}⚠️ No se pudo leer el archivo de origen: ${filePath}${RESET}\\n`;\r\n output += `\\n${CYAN}${BOLD}Stack Trace:${RESET}\\n${stackLines.slice(2).join('\\n')}\\n`;\r\n }\r\n }\r\n }\r\n output += help;\r\n console.error(output);\r\n}\r\n\r\nexport default Database;\r\n","import path from \"path\";\r\nimport { FileLogger } from \"@dbcube/core\";\r\nimport { createRequire } from 'module';\r\n\r\nexport class Trigger{\r\n private triggers: any[];\r\n private databaseName: string;\r\n private instance: any;\r\n\r\n constructor(instance:any, databaseName:string, metadata: any[]){\r\n this.triggers = metadata;\r\n this.databaseName = databaseName;\r\n this.instance = instance;\r\n }\r\n\r\n get(type:string){\r\n return this.triggers.find((tr:any)=> tr.type === type);\r\n }\r\n\r\n async execute(type: string, row:any){\r\n const trigger = this.triggers.find((tr:any)=> tr.type === type);\r\n if (trigger) {\r\n const logFilePath = path.resolve(\r\n process.cwd(),\r\n 'dbcube',\r\n 'logs',\r\n 'triggers',\r\n this.databaseName,\r\n `${trigger.table_ref}_${trigger.type}.log`\r\n );\r\n \r\n const interceptor = FileLogger.interceptConsole(logFilePath, {\r\n keepOriginal: false,\r\n useBuffer: true\r\n });\r\n const pathFile = path.resolve(process.cwd(), 'dbcube', 'triggers', `${trigger.database_ref}_${trigger.table_ref}_${trigger.type}.js`);\r\n // Use __filename for CJS, process.cwd() for ESM\r\n const requireUrl = typeof __filename !== 'undefined' ? __filename : process.cwd();\r\n const require = createRequire(requireUrl);\r\n // Clear require cache to ensure fresh load\r\n delete require.cache[require.resolve(pathFile)];\r\n const triggerModule = require(pathFile);\r\n const dataProcess = triggerModule.default || triggerModule;\r\n await dataProcess({db: this.instance, oldData: row, newData: row});\r\n interceptor.restore(); \r\n return interceptor;\r\n }\r\n return null;\r\n }\r\n}"],"mappings":"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","names":["import_core","path","require","fs","err"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/lib/Database.ts","../src/lib/Trigger.ts"],"sourcesContent":["import { Table, Database } from './lib/Database';\r\nimport type { DatabaseRecord, WhereCallback } from './@types/Database';\r\n\r\nexport default Database;\r\nexport { \r\n Table, \r\n Database,\r\n type DatabaseRecord,\r\n type WhereCallback\r\n};","import fs from 'fs';\r\nimport { QueryEngine, ComputedFieldProcessor, TriggerProcessor } from \"@dbcube/core\";\r\nimport { DatabaseRecord, DML, WhereCallback, WhereCondition } from \"../@types/Database\";\r\nimport { Trigger } from './Trigger';\r\n\r\n/**\r\n * Main class to handle MySQL database connections and queries.\r\n * Implements the Singleton pattern to ensure a single instance of the connection pool.\r\n */\r\nexport class Database {\r\n private name: string;\r\n private engine: any;\r\n private computedFields: any[];\r\n private triggers: any[];\r\n\r\n constructor(name: string) {\r\n this.name = name;\r\n const engine = new QueryEngine(name);\r\n this.engine = engine;\r\n this.computedFields = [];\r\n this.triggers = [];\r\n }\r\n\r\n async useComputes(): Promise<Database> {\r\n const newDatabase = new Database(this.name); \r\n const arrayComputedFields = await ComputedFieldProcessor.getComputedFields(this.name);\r\n newDatabase.setComputedFields(arrayComputedFields);\r\n return newDatabase;\r\n }\r\n\r\n async useTriggers(): Promise<Database> {\r\n const newDatabase = new Database(this.name); \r\n const arrayTriggers = await TriggerProcessor.getTriggers(this.name);\r\n newDatabase.setTriggers(arrayTriggers);\r\n return newDatabase;\r\n }\r\n\r\n async connect(): Promise<void> {\r\n const response = await this.engine.run('query_engine', [\r\n '--action', 'connect',\r\n ]);\r\n if (response.status != 200) {\r\n returnFormattedError(response.status, response.message);\r\n }\r\n return response.data;\r\n }\r\n\r\n async disconnect(): Promise<void> {\r\n return this.engine.run('query_engine', [\r\n '--action', 'disconnect',\r\n ]);\r\n }\r\n\r\n /**\r\n * Creates and returns a new instance of `Table` for the specified table.\r\n * This method is used to start building queries for a specific table.\r\n * It provides a fluent interface for common database operations like select, insert, update, and delete.\r\n *\r\n * @param {string} tableName - The name of the table to query.\r\n * @returns {Table} - Returns a new instance of `Table` for the specified table.\r\n *\r\n * @example\r\n * // Select all records from a table\r\n * const users = await db.table('users').get();\r\n * \r\n * // Select records with conditions\r\n * const activeUsers = await db.table('users')\r\n * .where('status', '=', 'active')\r\n * .orderBy('created_at', 'DESC')\r\n * .limit(10)\r\n * .get();\r\n * \r\n * // Insert records\r\n * await db.table('users').insert([\r\n * { name: 'John', email: 'john@example.com', age: 30 }\r\n * ]);\r\n * \r\n * // Update records\r\n * await db.table('users')\r\n * .where('id', '=', 1)\r\n * .update({ status: 'inactive' });\r\n * \r\n * // Delete records\r\n * await db.table('users')\r\n * .where('status', '=', 'deleted')\r\n * .delete();\r\n * \r\n * // Access column management\r\n * const columns = await db.table('users').columns().get();\r\n */\r\n table(tableName: string): Table {\r\n return new Table(this, this.name, tableName, this.engine, this.computedFields, this.triggers);\r\n }\r\n\r\n private setComputedFields(computedFields: any[]){\r\n this.computedFields = computedFields;\r\n }\r\n\r\n private setTriggers(triggers: any[]){\r\n this.triggers = triggers;\r\n }\r\n}\r\n\r\n/**\r\n * Class to build and execute SQL queries for a specific table.\r\n * Supports operations like SELECT, INSERT, UPDATE, DELETE, and more.\r\n */\r\nexport class Table {\r\n private engine: any;\r\n private nextType: 'AND' | 'OR' = 'AND';\r\n private dml: DML;\r\n private computedFields: any[] = [];\r\n private trigger: any;\r\n private triggers: any;\r\n\r\n constructor(instance: any, databaseName: string, tableName: string, engine: any = null, computedFields: any[] = [], triggers: any[] = []) {\r\n this.engine = engine;\r\n this.computedFields = computedFields;\r\n this.triggers = triggers;\r\n this.trigger = new Trigger(instance, databaseName, triggers);\r\n this.nextType = 'AND';\r\n\r\n this.dml = {\r\n type: 'select',\r\n database: databaseName,\r\n table: tableName,\r\n columns: ['*'],\r\n distinct: false,\r\n joins: [],\r\n where: [],\r\n orderBy: [],\r\n groupBy: [],\r\n limit: null,\r\n offset: null,\r\n data: null,\r\n aggregation: null\r\n };\r\n }\r\n\r\n /**\r\n * Specifies the columns to select in a SELECT query.\r\n *\r\n * @param {string[]} fields - Array of column names to select. If empty, selects all columns.\r\n * @returns {Table} - Returns the current instance of Table for method chaining.\r\n *\r\n * @example\r\n * const users = await db.table('users').select(['id', 'name']).get();\r\n * console.log(users); // [{ id: 1, name: 'John' }, { id: 2, name: 'Jane' }]\r\n */\r\n select(fields: string[] = []): Table {\r\n const clone = this.clone();\r\n clone.dml.type = 'select';\r\n clone.dml.columns = fields.length > 0 ? fields : ['*'];\r\n return clone;\r\n }\r\n\r\n /**\r\n * Adds a WHERE condition to the query.\r\n *\r\n * @param {string} column - The column to filter by.\r\n * @param {string} operator - The comparison operator (e.g., '=', '>', '<', 'IS NULL', 'IS NOT NULL').\r\n * @param {any} value - The value to compare against (optional for IS NULL/IS NOT NULL).\r\n * @returns {Table} - Returns the current instance of Table for method chaining.\r\n *\r\n * @example\r\n * const users = await db.table('users').where('age', '>', 25).get();\r\n * const nullUsers = await db.table('users').where('email', 'IS NULL').get();\r\n * console.log(users); // [{ id: 1, name: 'John', age: 30 }]\r\n */\r\n where(column: string, operator: 'IS NULL' | 'IS NOT NULL'): Table;\r\n where(column: string, operator: '=' | '!=' | '<>' | '>' | '<' | '>=' | '<=' | 'LIKE' | 'NOT LIKE' | 'IN' | 'NOT IN' | 'BETWEEN' | 'NOT BETWEEN', value: any): Table;\r\n where(column: string, operator: string, value?: any): Table {\r\n const clone = this.clone();\r\n clone.dml.where.push({\r\n column,\r\n operator,\r\n value,\r\n type: clone.nextType,\r\n isGroup: false\r\n });\r\n clone.nextType = 'AND';\r\n return clone;\r\n }\r\n\r\n /**\r\n * Adds an OR WHERE condition to the query.\r\n *\r\n * @param {string} column - The column to filter by.\r\n * @param {string} operator - The comparison operator (e.g., '=', '>', '<', 'IS NULL', 'IS NOT NULL').\r\n * @param {any} value - The value to compare against (optional for IS NULL/IS NOT NULL).\r\n * @returns {Table} - Returns the current instance of Table for method chaining.\r\n *\r\n * @example\r\n * const users = await db.table('users').where('age', '>', 25).orWhere('name', '=', 'Jane').get();\r\n * const nullUsers = await db.table('users').where('active', '=', true).orWhere('email', 'IS NULL').get();\r\n * console.log(users); // [{ id: 1, name: 'John', age: 30 }, { id: 2, name: 'Jane', age: 25 }]\r\n */\r\n orWhere(column: string, operator: 'IS NULL' | 'IS NOT NULL'): Table;\r\n orWhere(column: string, operator: '=' | '!=' | '<>' | '>' | '<' | '>=' | '<=' | 'LIKE' | 'NOT LIKE' | 'IN' | 'NOT IN' | 'BETWEEN' | 'NOT BETWEEN', value: any): Table;\r\n orWhere(column: string, operator: string, value?: any): Table {\r\n const clone = this.clone();\r\n clone.dml.where.push({\r\n column,\r\n operator,\r\n value,\r\n type: 'OR',\r\n isGroup: false\r\n });\r\n return clone;\r\n }\r\n\r\n /**\r\n * Adds a grouped WHERE condition to the query.\r\n *\r\n * @param {WhereCallback} callback - A callback function that receives a new Table instance to build the grouped conditions.\r\n * @returns {Table} - Returns the current instance of Table for method chaining.\r\n *\r\n * @example\r\n * const users = await db.table('users').whereGroup(query => {\r\n * query.where('age', '>', 25).orWhere('name', '=', 'Jane');\r\n * }).get();\r\n * console.log(users); // [{ id: 1, name: 'John', age: 30 }, { id: 2, name: 'Jane', age: 25 }]\r\n */\r\n whereGroup(callback: WhereCallback): Table {\r\n const clone = this.clone();\r\n const groupQuery = new Table(clone.dml.database, clone.dml.table, clone.engine);\r\n callback(groupQuery);\r\n\r\n clone.dml.where.push({\r\n type: clone.nextType,\r\n isGroup: true,\r\n conditions: groupQuery.dml.where as WhereCondition[]\r\n });\r\n clone.nextType = 'AND';\r\n return clone;\r\n }\r\n\r\n or(): Table {\r\n const clone = this.clone();\r\n clone.nextType = 'OR';\r\n return clone;\r\n }\r\n\r\n and(): Table {\r\n const clone = this.clone();\r\n clone.nextType = 'AND';\r\n return clone;\r\n }\r\n\r\n /**\r\n * Adds a WHERE BETWEEN condition to the query.\r\n *\r\n * @param {string} column - The column to filter by.\r\n * @param {[any, any]} values - A tuple with two values representing the range.\r\n * @returns {Table} - Returns the current instance of Table for method chaining.\r\n *\r\n * @example\r\n * const users = await db.table('users').whereBetween('age', [20, 30]).get();\r\n * console.log(users); // [{ id: 1, name: 'John', age: 30 }, { id: 2, name: 'Jane', age: 25 }]\r\n */\r\n whereBetween(column: string, values: [any, any]): Table {\r\n const clone = this.clone();\r\n const [value1, value2] = values;\r\n if (value1 !== undefined && value2 !== undefined) {\r\n clone.dml.where.push({\r\n column,\r\n operator: 'BETWEEN',\r\n value: [value1, value2],\r\n type: clone.nextType,\r\n isGroup: false\r\n });\r\n clone.nextType = 'AND';\r\n }\r\n return clone;\r\n }\r\n\r\n /**\r\n * Adds a WHERE IN condition to the query.\r\n *\r\n * @param {string} column - The column to filter by.\r\n * @param {any[]} values - An array of values to match.\r\n * @returns {Table} - Returns the current instance of Table for method chaining.\r\n *\r\n * @example\r\n * const users = await db.table('users').whereIn('id', [1, 2]).get();\r\n * console.log(users); // [{ id: 1, name: 'John' }, { id: 2, name: 'Jane' }]\r\n */\r\n whereIn(column: string, values: any[]): Table {\r\n const clone = this.clone();\r\n if (Array.isArray(values) && values.length > 0) {\r\n clone.dml.where.push({\r\n column,\r\n operator: 'IN',\r\n value: values,\r\n type: clone.nextType,\r\n isGroup: false\r\n });\r\n clone.nextType = 'AND';\r\n }\r\n return clone;\r\n }\r\n\r\n /**\r\n * Adds a WHERE IS NULL condition to the query.\r\n *\r\n * @param {string} column - The column to filter by.\r\n * @returns {Table} - Returns the current instance of Table for method chaining.\r\n *\r\n * @example\r\n * const users = await db.table('users').whereNull('email').get();\r\n * console.log(users); // [{ id: 3, name: 'Alice', email: null }]\r\n */\r\n whereNull(column: string): Table {\r\n const clone = this.clone();\r\n clone.dml.where.push({\r\n column,\r\n operator: 'IS NULL',\r\n type: clone.nextType,\r\n isGroup: false\r\n });\r\n clone.nextType = 'AND';\r\n return clone;\r\n }\r\n\r\n /**\r\n * Adds a WHERE IS NOT NULL condition to the query.\r\n *\r\n * @param {string} column - The column to filter by.\r\n * @returns {Table} - Returns the current instance of Table for method chaining.\r\n *\r\n * @example\r\n * const users = await db.table('users').whereNotNull('email').get();\r\n * console.log(users); // [{ id: 1, name: 'John', email: 'john@example.com' }]\r\n */\r\n whereNotNull(column: string): Table {\r\n const clone = this.clone();\r\n clone.dml.where.push({\r\n column,\r\n operator: 'IS NOT NULL',\r\n type: clone.nextType,\r\n isGroup: false\r\n });\r\n clone.nextType = 'AND';\r\n return clone;\r\n }\r\n\r\n /**\r\n * Adds a JOIN clause to the query.\r\n *\r\n * @param {string} table - The table to join.\r\n * @param {string} column1 - The column from the current table.\r\n * @param {string} operator - The comparison operator (e.g., '=', '>', '<').\r\n * @param {string} column2 - The column from the joined table.\r\n * @returns {Table} - Returns the current instance of Table for method chaining.\r\n *\r\n * @example\r\n * const users = await db.table('users').join('orders', 'users.id', '=', 'orders.user_id').get();\r\n * console.log(users); // [{ id: 1, name: 'John', order_id: 101 }]\r\n */\r\n join(table: string, column1: string, operator: string, column2: string): Table {\r\n const clone = this.clone();\r\n clone.dml.joins.push({\r\n type: 'INNER',\r\n table,\r\n on: {\r\n column1,\r\n operator,\r\n column2\r\n }\r\n });\r\n return clone;\r\n }\r\n\r\n /**\r\n * Adds a LEFT JOIN clause to the query.\r\n *\r\n * @param {string} table - The table to join.\r\n * @param {string} column1 - The column from the current table.\r\n * @param {string} operator - The comparison operator (e.g., '=', '>', '<').\r\n * @param {string} column2 - The column from the joined table.\r\n * @returns {Table} - Returns the current instance of Table for method chaining.\r\n *\r\n * @example\r\n * const users = await db.table('users').leftJoin('orders', 'users.id', '=', 'orders.user_id').get();\r\n * console.log(users); // [{ id: 1, name: 'John', order_id: 101 }, { id: 2, name: 'Jane', order_id: null }]\r\n */\r\n leftJoin(table: string, column1: string, operator: string, column2: string): Table {\r\n const clone = this.clone();\r\n clone.dml.joins.push({\r\n type: 'LEFT',\r\n table,\r\n on: {\r\n column1,\r\n operator,\r\n column2\r\n }\r\n });\r\n return clone;\r\n }\r\n\r\n /**\r\n * Adds a RIGHT JOIN clause to the query.\r\n *\r\n * @param {string} table - The table to join.\r\n * @param {string} column1 - The column from the current table.\r\n * @param {string} operator - The comparison operator (e.g., '=', '>', '<').\r\n * @param {string} column2 - The column from the joined table.\r\n * @returns {Table} - Returns the current instance of Table for method chaining.\r\n *\r\n * @example\r\n * const users = await db.table('users').rightJoin('orders', 'users.id', '=', 'orders.user_id').get();\r\n * console.log(users); // [{ id: 1, name: 'John', order_id: 101 }, { id: null, name: null, order_id: 102 }]\r\n */\r\n rightJoin(table: string, column1: string, operator: string, column2: string): Table {\r\n const clone = this.clone();\r\n clone.dml.joins.push({\r\n type: 'RIGHT',\r\n table,\r\n on: {\r\n column1,\r\n operator,\r\n column2\r\n }\r\n });\r\n return clone;\r\n }\r\n\r\n /**\r\n * Adds an ORDER BY clause to the query.\r\n *\r\n * @param {string} column - The column to order by.\r\n * @param {'ASC' | 'DESC'} direction - The sorting direction ('ASC' or 'DESC').\r\n * @returns {Table} - Returns the current instance of Table for method chaining.\r\n *\r\n * @example\r\n * const users = await db.table('users').orderBy('name', 'ASC').get();\r\n * console.log(users); // [{ id: 2, name: 'Jane' }, { id: 1, name: 'John' }]\r\n */\r\n orderBy(column: string, direction: 'ASC' | 'DESC' = 'ASC'): Table {\r\n const clone = this.clone();\r\n const validDirections: ('ASC' | 'DESC')[] = ['ASC', 'DESC'];\r\n if (validDirections.includes(direction.toUpperCase() as 'ASC' | 'DESC')) {\r\n clone.dml.orderBy.push({\r\n column,\r\n direction: direction.toUpperCase() as 'ASC' | 'DESC'\r\n });\r\n } else {\r\n throw new Error(`Invalid direction: ${direction}. Use 'ASC' or 'DESC'.`);\r\n }\r\n return clone;\r\n }\r\n\r\n /**\r\n * Adds a GROUP BY clause to the query.\r\n *\r\n * @param {string} column - The column to group by.\r\n * @returns {Table} - Returns the current instance of Table for method chaining.\r\n *\r\n * @example\r\n * const users = await db.table('users').groupBy('age').get();\r\n * console.log(users); // [{ age: 30, count: 1 }, { age: 25, count: 1 }]\r\n */\r\n groupBy(column: string): Table {\r\n const clone = this.clone();\r\n clone.dml.groupBy.push(column);\r\n return clone;\r\n }\r\n\r\n /**\r\n * Adds a DISTINCT clause to the query.\r\n *\r\n * @returns {Table} - Returns the current instance of Table for method chaining.\r\n *\r\n * @example\r\n * const users = await db.table('users').distinct().select(['name']).get();\r\n * console.log(users); // [{ name: 'John' }, { name: 'Jane' }]\r\n */\r\n distinct(): Table {\r\n const clone = this.clone();\r\n clone.dml.distinct = true;\r\n return clone;\r\n }\r\n\r\n /**\r\n * Adds a COUNT clause to the query.\r\n *\r\n * @param {string} column - The column to count (default is '*').\r\n * @returns {Table} - Returns the current instance of Table for method chaining.\r\n *\r\n * @example\r\n * const count = await db.table('users').count().first();\r\n * console.log(count); // { count: 2 }\r\n */\r\n async count(column: string = '*'): Promise<Number> {\r\n const executionDML = {\r\n ...this.dml,\r\n type: 'select',\r\n aggregation: {\r\n type: 'COUNT',\r\n column,\r\n alias: 'count'\r\n },\r\n columns: [`COUNT(${column}) AS count`],\r\n data: null,\r\n limit: 1\r\n };\r\n try {\r\n const result = await this.getResponse(executionDML);\r\n const res = result[0] || null;\r\n if(res){\r\n return res.count;\r\n }\r\n return 0;\r\n }\r\n catch (error) {\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Adds a SUM clause to the query.\r\n *\r\n * @param {string} column - The column to sum.\r\n * @returns {Table} - Returns the current instance of Table for method chaining.\r\n *\r\n * @example\r\n * const totalAge = await db.table('users').sum('age').first();\r\n * console.log(totalAge); // { sum: 55 }\r\n */\r\n async sum(column: string): Promise<Number> {\r\n const executionDML = {\r\n ...this.dml,\r\n type: 'select',\r\n aggregation: {\r\n type: 'SUM',\r\n column,\r\n alias: 'sum'\r\n },\r\n columns: [`SUM(${column}) AS sum`],\r\n data: null,\r\n limit: 1\r\n };\r\n try {\r\n const result = await this.getResponse(executionDML);\r\n const res = result[0] || null;\r\n if(res){\r\n return res.sum;\r\n }\r\n return 0;\r\n }\r\n catch (error) {\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Adds an AVG clause to the query.\r\n *\r\n * @param {string} column - The column to calculate the average.\r\n * @returns {Table} - Returns the current instance of Table for method chaining.\r\n *\r\n * @example\r\n * const avgAge = await db.table('users').avg('age').first();\r\n * console.log(avgAge); // { avg: 27.5 }\r\n */\r\n async avg(column: string): Promise<Number> {\r\n const executionDML = {\r\n ...this.dml,\r\n type: 'select',\r\n aggregation: {\r\n type: 'AVG',\r\n column,\r\n alias: 'avg'\r\n },\r\n columns: [`AVG(${column}) AS avg`],\r\n data: null,\r\n limit: 1\r\n };\r\n try {\r\n const result = await this.getResponse(executionDML);\r\n const res = result[0] || null;\r\n if(res){\r\n return res.avg;\r\n }\r\n return 0;\r\n }\r\n catch (error) {\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Adds a MAX clause to the query.\r\n *\r\n * @param {string} column - The column to find the maximum value.\r\n * @returns {Table} - Returns the current instance of Table for method chaining.\r\n *\r\n * @example\r\n * const maxAge = await db.table('users').max('age').first();\r\n * console.log(maxAge); // { max: 30 }\r\n */\r\n async max(column: string): Promise<Number> {\r\n const executionDML = {\r\n ...this.dml,\r\n type: 'select',\r\n aggregation: {\r\n type: 'MAX',\r\n column,\r\n alias: 'max'\r\n },\r\n columns: [`MAX(${column}) AS max`],\r\n data: null,\r\n limit: 1\r\n };\r\n try {\r\n const result = await this.getResponse(executionDML);\r\n const res = result[0] || null;\r\n if(res){\r\n return res.max;\r\n }\r\n return 0;\r\n }\r\n catch (error) {\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Adds a MIN clause to the query.\r\n *\r\n * @param {string} column - The column to find the minimum value.\r\n * @returns {Table} - Returns the current instance of Table for method chaining.\r\n *\r\n * @example\r\n * const minAge = await db.table('users').min('age').first();\r\n * console.log(minAge); // { min: 25 }\r\n */\r\n async min(column: string): Promise<Number> {\r\n const executionDML = {\r\n ...this.dml,\r\n type: 'select',\r\n aggregation: {\r\n type: 'MIN',\r\n column,\r\n alias: 'min'\r\n },\r\n columns: [`MIN(${column}) AS min`],\r\n data: null,\r\n limit: 1\r\n };\r\n try {\r\n const result = await this.getResponse(executionDML);\r\n const res = result[0] || null;\r\n if(res){\r\n return res.min;\r\n }\r\n return 0;\r\n }\r\n catch (error) {\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Adds a LIMIT clause to the query.\r\n *\r\n * @param {number} number - The maximum number of rows to return.\r\n * @returns {Table} - Returns the current instance of Table for method chaining.\r\n *\r\n * @example\r\n * const users = await db.table('users').limit(1).get();\r\n * console.log(users); // [{ id: 1, name: 'John', age: 30 }]\r\n */\r\n limit(number: number): Table {\r\n const clone = this.clone();\r\n clone.dml.limit = number;\r\n return clone;\r\n }\r\n\r\n /**\r\n * Adds pagination to the query using LIMIT and OFFSET.\r\n *\r\n * @param {number} number - The page number (starting from 1).\r\n * @returns {Table} - Returns the current instance of Table for method chaining.\r\n *\r\n * @example\r\n * const users = await db.table('users').limit(1).page(2).get();\r\n * console.log(users); // [{ id: 2, name: 'Jane', age: 25 }]\r\n */\r\n page(number: number): Table {\r\n const clone = this.clone();\r\n if (clone.dml.limit) {\r\n clone.dml.offset = (number - 1) * clone.dml.limit;\r\n }\r\n return clone;\r\n }\r\n\r\n /**\r\n * Executes the query and returns all matching rows.\r\n *\r\n * @returns {Promise<DatabaseRecord[]>} - Returns an array of rows.\r\n *\r\n * @example\r\n * const users = await db.table('users').get();\r\n * console.log(users); // [{ id: 1, name: 'John' }, { id: 2, name: 'Jane' }]\r\n */\r\n async get(): Promise<DatabaseRecord[]> {\r\n try {\r\n const executionDML = {\r\n ...this.dml,\r\n type: 'select',\r\n data: null\r\n };\r\n const result = await this.getResponse(executionDML);\r\n return result;\r\n }\r\n catch (error) {\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Executes the query and returns the first matching row.\r\n *\r\n * @returns {Promise<DatabaseRecord | null>} - Returns the first row or null if no rows match.\r\n *\r\n * @example\r\n * const user = await db.table('users').first();\r\n * console.log(user); // { id: 1, name: 'John' }\r\n */\r\n async first(): Promise<DatabaseRecord | null> {\r\n const executionDML = {\r\n ...this.dml,\r\n type: 'select',\r\n data: null,\r\n limit: 1\r\n };\r\n try {\r\n const result = await this.getResponse(executionDML);\r\n return result[0] || null;\r\n }\r\n catch (error) {\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Finds a row by a specific column value.\r\n *\r\n * @param {any} value - The value to search for.\r\n * @param {string} column - The column to search in (default is 'id').\r\n * @returns {Promise<DatabaseRecord | null>} - Returns the first matching row or null if no rows match.\r\n *\r\n * @example\r\n * const user = await db.table('users').find(1);\r\n * console.log(user); // { id: 1, name: 'John' }\r\n */\r\n async find(value: any, column: string = 'id'): Promise<DatabaseRecord | null> {\r\n const executionDML = {\r\n ...this.dml,\r\n type: 'select',\r\n data: null,\r\n where: [...this.dml.where, {\r\n column,\r\n operator: '=',\r\n value,\r\n type: 'AND',\r\n isGroup: false\r\n }],\r\n limit: 1\r\n };\r\n try {\r\n const result = await this.getResponse(executionDML);\r\n return result[0] || null;\r\n }\r\n catch (error) {\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Inserts one or more rows into the table.\r\n *\r\n * @param {DatabaseRecord[]} data - An array of objects representing the rows to insert.\r\n * @returns {Promise<DatabaseRecord[]>} - Returns an array of the inserted rows.\r\n *\r\n * @example\r\n * const newUsers = await db.table('users').insert([\r\n * { name: 'Alice', age: 28 },\r\n * { name: 'Bob', age: 32 }\r\n * ]);\r\n * console.log(newUsers); // [{ id: 3, name: 'Alice', age: 28 }, { id: 4, name: 'Bob', age: 32 }]\r\n */\r\n async insert(data: DatabaseRecord[]): Promise<DatabaseRecord[]> {\r\n if (!Array.isArray(data)) {\r\n throw new Error('The insert method requires an array of objects with key-value pairs.');\r\n }\r\n\r\n if (!data.every(item => typeof item === 'object' && item !== null)) {\r\n throw new Error('The array must contain only valid objects.');\r\n }\r\n\r\n const executionDML = {\r\n ...this.dml,\r\n type: 'insert',\r\n data: data\r\n };\r\n\r\n const result = await this.getResponse(executionDML, 'Add');\r\n\r\n // Handle different database responses\r\n if (result && result[0]) {\r\n // MongoDB returns inserted_ids array\r\n if (result[0].inserted_ids !== undefined && Array.isArray(result[0].inserted_ids)) {\r\n return data.map((item, index) => ({\r\n ...item,\r\n _id: result[0].inserted_ids[index]\r\n }));\r\n }\r\n\r\n // SQL databases return last_insert_id for single inserts\r\n if (result[0].last_insert_id !== undefined && data.length === 1) {\r\n return [{\r\n ...data[0],\r\n id: result[0].last_insert_id\r\n }];\r\n }\r\n }\r\n\r\n return data;\r\n }\r\n\r\n /**\r\n * Updates rows in the table based on the defined conditions.\r\n *\r\n * @param {DatabaseRecord} data - An object with key-value pairs representing the fields to update.\r\n * @returns {Promise<any>} - Returns the result of the update operation.\r\n *\r\n * @example\r\n * const result = await db.table('users')\r\n * .where('id', '=', 1)\r\n * .update({ name: 'John Updated', age: 31 });\r\n * console.log(result); // { affectedRows: 1 }\r\n */\r\n async update(data: DatabaseRecord): Promise<any> {\r\n if (typeof data !== 'object' || Array.isArray(data)) {\r\n throw new Error('The update method requires an object with key-value pairs.');\r\n }\r\n\r\n if (this.dml.where.length === 0) {\r\n throw new Error('You must specify at least one WHERE condition to perform an update.');\r\n }\r\n\r\n const executionDML = {\r\n ...this.dml,\r\n type: 'update',\r\n data: data\r\n };\r\n\r\n await this.getResponse(executionDML, 'Update');\r\n\r\n return data;\r\n }\r\n\r\n /**\r\n * Deletes rows from the table based on the defined conditions.\r\n *\r\n * @returns {Promise<any>} - Returns the result of the delete operation.\r\n *\r\n * @example\r\n * const result = await db.table('users').where('id', '=', 1).delete();\r\n * console.log(result); // { affectedRows: 1 }\r\n */\r\n async delete(): Promise<any> {\r\n if (this.dml.where.length === 0) {\r\n throw new Error('You must specify at least one WHERE condition to perform a delete.');\r\n }\r\n\r\n const executionDML = {\r\n ...this.dml,\r\n type: 'delete'\r\n };\r\n\r\n const deleteData = await this.getResponse(executionDML, 'Delete');\r\n return deleteData;\r\n }\r\n\r\n private async getResponse(dml: any = null, type: any = null): Promise<any> {\r\n const localDML = dml ? dml : this.dml;\r\n const computedFieldsNeeded: any[] = [];\r\n let dependeciesArrray: any[] = [];\r\n\r\n if (this.computedFields.length > 0) {\r\n let columns = localDML.columns;\r\n\r\n for (const field of localDML.columns) {\r\n const computedField = this.computedFields.find(cf => cf.column === field);\r\n\r\n if (computedField) {\r\n computedFieldsNeeded.push(computedField);\r\n // Add dependencies to real fields\r\n const dependencies = ComputedFieldProcessor.extractDependencies(computedField.instruction);\r\n dependeciesArrray = [...dependeciesArrray, ...dependencies];\r\n columns = Array.from(new Set([...columns, ...dependencies]));\r\n columns = columns.filter((col: string) => col != field);\r\n }\r\n }\r\n localDML.columns = columns;\r\n }\r\n\r\n let arrayResult = [];\r\n if (type) {\r\n const beffore = this.trigger.get('before' + type);\r\n const after = this.trigger.get('after' + type);\r\n if (this.triggers.length > 0 && (beffore || after)) {\r\n const dataset = localDML.data;\r\n for (let index = 0; index < dataset.length; index++) {\r\n const data = dataset[index];\r\n const newDML = { ...localDML, data: [data] };\r\n if (beffore) {\r\n const interceptor = await this.trigger.execute('before' + type, data);\r\n const response = await this.engine.run('query_engine', [\r\n '--action', 'execute',\r\n '--dml', JSON.stringify(newDML)\r\n ]);\r\n\r\n if (response.status != 200) {\r\n interceptor.discard();\r\n returnFormattedError(response.status, response.message);\r\n }\r\n await interceptor.commit();\r\n arrayResult = response.data;\r\n }\r\n if (after) {\r\n\r\n const response = await this.engine.run('query_engine', [\r\n '--action', 'execute',\r\n '--dml', JSON.stringify(newDML)\r\n ]);\r\n\r\n if (response.status != 200) {\r\n returnFormattedError(response.status, response.message);\r\n }\r\n const interceptor = await this.trigger.execute('after' + type, data);\r\n await interceptor.commit();\r\n }\r\n }\r\n } else {\r\n const response = await this.engine.run('query_engine', [\r\n '--action', 'execute',\r\n '--dml', JSON.stringify(localDML)\r\n ]);\r\n\r\n if (response.status != 200) {\r\n returnFormattedError(response.status, response.message);\r\n }\r\n\r\n arrayResult = response.data;\r\n }\r\n } else {\r\n const response = await this.engine.run('query_engine', [\r\n '--action', 'execute',\r\n '--dml', JSON.stringify(localDML)\r\n ]);\r\n\r\n if (response.status != 200) {\r\n returnFormattedError(response.status, response.message);\r\n }\r\n\r\n arrayResult = response.data;\r\n }\r\n\r\n if (computedFieldsNeeded.length > 0) {\r\n let newDataset: any = ComputedFieldProcessor.computedFields(arrayResult, computedFieldsNeeded);\r\n const result = newDataset.map((obj: any) => {\r\n const newObj = { ...obj };\r\n dependeciesArrray.forEach(key => delete newObj[key]);\r\n return newObj;\r\n });\r\n return result;\r\n }\r\n\r\n return arrayResult;\r\n }\r\n\r\n private clone(): Table {\r\n const cloned = Object.create(Object.getPrototypeOf(this));\r\n cloned.engine = this.engine;\r\n cloned.nextType = this.nextType;\r\n cloned.computedFields = this.computedFields;\r\n cloned.trigger = this.trigger;\r\n cloned.triggers = this.triggers;\r\n cloned.dml = {\r\n ...this.dml,\r\n columns: [...this.dml.columns],\r\n joins: [...this.dml.joins],\r\n where: [...this.dml.where],\r\n orderBy: [...this.dml.orderBy],\r\n groupBy: [...this.dml.groupBy]\r\n };\r\n return cloned;\r\n }\r\n\r\n}\r\n\r\nfunction returnFormattedError(status: number, message: string) {\r\n const RESET = '\\x1b[0m';\r\n const RED = '\\x1b[31m';\r\n const YELLOW = '\\x1b[33m';\r\n const BOLD = '\\x1b[1m';\r\n const CYAN = '\\x1b[36m';\r\n const GRAY = '\\x1b[90m';\r\n const UNDERLINE = '\\x1b[4m';\r\n const MAGENTA = '\\x1b[35m';\r\n\r\n let output = '';\r\n let help = '';\r\n const color = status === 600 ? YELLOW : RED;\r\n\r\n\r\n if (message.includes(\"[help]\")) {\r\n const parts = message.split(\"[help]\");\r\n output += `\\n${RED}${BOLD}${parts[0]}${RESET}`;\r\n help += `\\n${MAGENTA}${BOLD}[help]${RESET} ${GRAY}${parts[1]}${RESET}\\n`;\r\n } else {\r\n output += `\\n${color}${BOLD}${message}${RESET}\\n`;\r\n }\r\n\r\n const err = new Error();\r\n const stackLines = err.stack?.split('\\n') || [];\r\n\r\n // Buscamos la primera línea del stack fuera de node_modules\r\n const relevantStackLine = stackLines.find(line =>\r\n line.includes('.js:') && !line.includes('node_modules')\r\n );\r\n\r\n if (relevantStackLine) {\r\n const match = relevantStackLine.match(/\\((.*):(\\d+):(\\d+)\\)/) ||\r\n relevantStackLine.match(/at (.*):(\\d+):(\\d+)/);\r\n\r\n if (match) {\r\n const [, filePath, lineStr, columnStr] = match;\r\n const lineNum = parseInt(lineStr, 10);\r\n const errorLocation = `${filePath}:${lineStr}:${columnStr}`;\r\n\r\n // Leemos el archivo y sacamos las líneas relevantes\r\n try {\r\n const codeLines = fs.readFileSync(filePath, 'utf-8').split('\\n');\r\n const start = Math.max(0, lineNum - 3);\r\n const end = Math.min(codeLines.length, lineNum + 2);\r\n\r\n output += `\\n${CYAN}${BOLD}[code] ${RESET}${YELLOW} ${UNDERLINE}${errorLocation}${RESET}\\n`;\r\n\r\n for (let i = start; i < end; i++) {\r\n const line = codeLines[i];\r\n const lineLabel = `${i + 1}`.padStart(4, ' ');\r\n const pointer = i + 1 === lineNum ? `${RED}<-${RESET}` : ' ';\r\n output += `${GRAY}${lineLabel}${RESET} ${pointer} ${line}\\n`;\r\n }\r\n } catch (err) {\r\n output += `${YELLOW}⚠️ No se pudo leer el archivo de origen: ${filePath}${RESET}\\n`;\r\n output += `\\n${CYAN}${BOLD}Stack Trace:${RESET}\\n${stackLines.slice(2).join('\\n')}\\n`;\r\n }\r\n }\r\n }\r\n output += help;\r\n console.error(output);\r\n}\r\n\r\nexport default Database;\r\n","import path from \"path\";\r\nimport { FileLogger } from \"@dbcube/core\";\r\nimport { createRequire } from 'module';\r\n\r\nexport class Trigger{\r\n private triggers: any[];\r\n private databaseName: string;\r\n private instance: any;\r\n\r\n constructor(instance:any, databaseName:string, metadata: any[]){\r\n this.triggers = metadata;\r\n this.databaseName = databaseName;\r\n this.instance = instance;\r\n }\r\n\r\n get(type:string){\r\n return this.triggers.find((tr:any)=> tr.type === type);\r\n }\r\n\r\n async execute(type: string, row:any){\r\n const trigger = this.triggers.find((tr:any)=> tr.type === type);\r\n if (trigger) {\r\n const logFilePath = path.resolve(\r\n process.cwd(),\r\n 'dbcube',\r\n 'logs',\r\n 'triggers',\r\n this.databaseName,\r\n `${trigger.table_ref}_${trigger.type}.log`\r\n );\r\n \r\n const interceptor = FileLogger.interceptConsole(logFilePath, {\r\n keepOriginal: false,\r\n useBuffer: true\r\n });\r\n const pathFile = path.resolve(process.cwd(), 'dbcube', 'triggers', `${trigger.database_ref}_${trigger.table_ref}_${trigger.type}.js`);\r\n // Use __filename for CJS, process.cwd() for ESM\r\n const requireUrl = typeof __filename !== 'undefined' ? __filename : process.cwd();\r\n const require = createRequire(requireUrl);\r\n // Clear require cache to ensure fresh load\r\n delete require.cache[require.resolve(pathFile)];\r\n const triggerModule = require(pathFile);\r\n const dataProcess = triggerModule.default || triggerModule;\r\n await dataProcess({db: this.instance, oldData: row, newData: row});\r\n interceptor.restore(); \r\n return interceptor;\r\n }\r\n return null;\r\n }\r\n}"],"mappings":"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","names":["import_core","path","require","fs","err"]}
package/dist/index.js CHANGED
@@ -472,17 +472,20 @@ var Table = class _Table {
472
472
  * console.log(count); // { count: 2 }
473
473
  */
474
474
  async count(column = "*") {
475
- this.dml.type = "select";
476
- this.dml.aggregation = {
477
- type: "COUNT",
478
- column,
479
- alias: "count"
475
+ const executionDML = {
476
+ ...this.dml,
477
+ type: "select",
478
+ aggregation: {
479
+ type: "COUNT",
480
+ column,
481
+ alias: "count"
482
+ },
483
+ columns: [`COUNT(${column}) AS count`],
484
+ data: null,
485
+ limit: 1
480
486
  };
481
- this.dml.columns = [`COUNT(${column}) AS count`];
482
- this.dml.data = null;
483
- this.dml.limit = 1;
484
487
  try {
485
- const result = await this.getResponse();
488
+ const result = await this.getResponse(executionDML);
486
489
  const res = result[0] || null;
487
490
  if (res) {
488
491
  return res.count;
@@ -503,17 +506,20 @@ var Table = class _Table {
503
506
  * console.log(totalAge); // { sum: 55 }
504
507
  */
505
508
  async sum(column) {
506
- this.dml.type = "select";
507
- this.dml.aggregation = {
508
- type: "SUM",
509
- column,
510
- alias: "sum"
509
+ const executionDML = {
510
+ ...this.dml,
511
+ type: "select",
512
+ aggregation: {
513
+ type: "SUM",
514
+ column,
515
+ alias: "sum"
516
+ },
517
+ columns: [`SUM(${column}) AS sum`],
518
+ data: null,
519
+ limit: 1
511
520
  };
512
- this.dml.columns = [`SUM(${column}) AS sum`];
513
- this.dml.data = null;
514
- this.dml.limit = 1;
515
521
  try {
516
- const result = await this.getResponse();
522
+ const result = await this.getResponse(executionDML);
517
523
  const res = result[0] || null;
518
524
  if (res) {
519
525
  return res.sum;
@@ -534,17 +540,20 @@ var Table = class _Table {
534
540
  * console.log(avgAge); // { avg: 27.5 }
535
541
  */
536
542
  async avg(column) {
537
- this.dml.type = "select";
538
- this.dml.aggregation = {
539
- type: "AVG",
540
- column,
541
- alias: "avg"
543
+ const executionDML = {
544
+ ...this.dml,
545
+ type: "select",
546
+ aggregation: {
547
+ type: "AVG",
548
+ column,
549
+ alias: "avg"
550
+ },
551
+ columns: [`AVG(${column}) AS avg`],
552
+ data: null,
553
+ limit: 1
542
554
  };
543
- this.dml.columns = [`AVG(${column}) AS avg`];
544
- this.dml.data = null;
545
- this.dml.limit = 1;
546
555
  try {
547
- const result = await this.getResponse();
556
+ const result = await this.getResponse(executionDML);
548
557
  const res = result[0] || null;
549
558
  if (res) {
550
559
  return res.avg;
@@ -565,17 +574,20 @@ var Table = class _Table {
565
574
  * console.log(maxAge); // { max: 30 }
566
575
  */
567
576
  async max(column) {
568
- this.dml.type = "select";
569
- this.dml.aggregation = {
570
- type: "MAX",
571
- column,
572
- alias: "max"
577
+ const executionDML = {
578
+ ...this.dml,
579
+ type: "select",
580
+ aggregation: {
581
+ type: "MAX",
582
+ column,
583
+ alias: "max"
584
+ },
585
+ columns: [`MAX(${column}) AS max`],
586
+ data: null,
587
+ limit: 1
573
588
  };
574
- this.dml.columns = [`MAX(${column}) AS max`];
575
- this.dml.data = null;
576
- this.dml.limit = 1;
577
589
  try {
578
- const result = await this.getResponse();
590
+ const result = await this.getResponse(executionDML);
579
591
  const res = result[0] || null;
580
592
  if (res) {
581
593
  return res.max;
@@ -596,17 +608,20 @@ var Table = class _Table {
596
608
  * console.log(minAge); // { min: 25 }
597
609
  */
598
610
  async min(column) {
599
- this.dml.type = "select";
600
- this.dml.aggregation = {
601
- type: "MIN",
602
- column,
603
- alias: "min"
611
+ const executionDML = {
612
+ ...this.dml,
613
+ type: "select",
614
+ aggregation: {
615
+ type: "MIN",
616
+ column,
617
+ alias: "min"
618
+ },
619
+ columns: [`MIN(${column}) AS min`],
620
+ data: null,
621
+ limit: 1
604
622
  };
605
- this.dml.columns = [`MIN(${column}) AS min`];
606
- this.dml.data = null;
607
- this.dml.limit = 1;
608
623
  try {
609
- const result = await this.getResponse();
624
+ const result = await this.getResponse(executionDML);
610
625
  const res = result[0] || null;
611
626
  if (res) {
612
627
  return res.min;
@@ -659,9 +674,12 @@ var Table = class _Table {
659
674
  */
660
675
  async get() {
661
676
  try {
662
- this.dml.type = "select";
663
- this.dml.data = null;
664
- const result = await this.getResponse();
677
+ const executionDML = {
678
+ ...this.dml,
679
+ type: "select",
680
+ data: null
681
+ };
682
+ const result = await this.getResponse(executionDML);
665
683
  return result;
666
684
  } catch (error) {
667
685
  throw error;
@@ -677,11 +695,14 @@ var Table = class _Table {
677
695
  * console.log(user); // { id: 1, name: 'John' }
678
696
  */
679
697
  async first() {
680
- this.dml.type = "select";
681
- this.dml.data = null;
682
- this.dml.limit = 1;
698
+ const executionDML = {
699
+ ...this.dml,
700
+ type: "select",
701
+ data: null,
702
+ limit: 1
703
+ };
683
704
  try {
684
- const result = await this.getResponse();
705
+ const result = await this.getResponse(executionDML);
685
706
  return result[0] || null;
686
707
  } catch (error) {
687
708
  throw error;
@@ -699,12 +720,21 @@ var Table = class _Table {
699
720
  * console.log(user); // { id: 1, name: 'John' }
700
721
  */
701
722
  async find(value, column = "id") {
702
- this.dml.type = "select";
703
- this.dml.data = null;
704
- this.where(column, "=", value);
705
- this.dml.limit = 1;
723
+ const executionDML = {
724
+ ...this.dml,
725
+ type: "select",
726
+ data: null,
727
+ where: [...this.dml.where, {
728
+ column,
729
+ operator: "=",
730
+ value,
731
+ type: "AND",
732
+ isGroup: false
733
+ }],
734
+ limit: 1
735
+ };
706
736
  try {
707
- const result = await this.getResponse();
737
+ const result = await this.getResponse(executionDML);
708
738
  return result[0] || null;
709
739
  } catch (error) {
710
740
  throw error;
@@ -730,9 +760,26 @@ var Table = class _Table {
730
760
  if (!data.every((item) => typeof item === "object" && item !== null)) {
731
761
  throw new Error("The array must contain only valid objects.");
732
762
  }
733
- this.dml.type = "insert";
734
- this.dml.data = data;
735
- await this.getResponse(this.dml, "Add");
763
+ const executionDML = {
764
+ ...this.dml,
765
+ type: "insert",
766
+ data
767
+ };
768
+ const result = await this.getResponse(executionDML, "Add");
769
+ if (result && result[0]) {
770
+ if (result[0].inserted_ids !== void 0 && Array.isArray(result[0].inserted_ids)) {
771
+ return data.map((item, index) => ({
772
+ ...item,
773
+ _id: result[0].inserted_ids[index]
774
+ }));
775
+ }
776
+ if (result[0].last_insert_id !== void 0 && data.length === 1) {
777
+ return [{
778
+ ...data[0],
779
+ id: result[0].last_insert_id
780
+ }];
781
+ }
782
+ }
736
783
  return data;
737
784
  }
738
785
  /**
@@ -754,9 +801,12 @@ var Table = class _Table {
754
801
  if (this.dml.where.length === 0) {
755
802
  throw new Error("You must specify at least one WHERE condition to perform an update.");
756
803
  }
757
- this.dml.type = "update";
758
- this.dml.data = data;
759
- await this.getResponse(this.dml, "Update");
804
+ const executionDML = {
805
+ ...this.dml,
806
+ type: "update",
807
+ data
808
+ };
809
+ await this.getResponse(executionDML, "Update");
760
810
  return data;
761
811
  }
762
812
  /**
@@ -772,8 +822,11 @@ var Table = class _Table {
772
822
  if (this.dml.where.length === 0) {
773
823
  throw new Error("You must specify at least one WHERE condition to perform a delete.");
774
824
  }
775
- this.dml.type = "delete";
776
- const deleteData = await this.getResponse(this.dml, "Delete");
825
+ const executionDML = {
826
+ ...this.dml,
827
+ type: "delete"
828
+ };
829
+ const deleteData = await this.getResponse(executionDML, "Delete");
777
830
  return deleteData;
778
831
  }
779
832
  async getResponse(dml = null, type = null) {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/lib/Database.ts","../src/lib/Trigger.ts","../src/index.ts"],"sourcesContent":["import fs from 'fs';\r\nimport { QueryEngine, ComputedFieldProcessor, TriggerProcessor } from \"@dbcube/core\";\r\nimport { DatabaseRecord, DML, WhereCallback, WhereCondition } from \"../@types/Database\";\r\nimport { Trigger } from './Trigger';\r\n\r\n/**\r\n * Main class to handle MySQL database connections and queries.\r\n * Implements the Singleton pattern to ensure a single instance of the connection pool.\r\n */\r\nexport class Database {\r\n private name: string;\r\n private engine: any;\r\n private computedFields: any[];\r\n private triggers: any[];\r\n\r\n constructor(name: string) {\r\n this.name = name;\r\n const engine = new QueryEngine(name);\r\n this.engine = engine;\r\n this.computedFields = [];\r\n this.triggers = [];\r\n }\r\n\r\n async useComputes(): Promise<Database> {\r\n const newDatabase = new Database(this.name); \r\n const arrayComputedFields = await ComputedFieldProcessor.getComputedFields(this.name);\r\n newDatabase.setComputedFields(arrayComputedFields);\r\n return newDatabase;\r\n }\r\n\r\n async useTriggers(): Promise<Database> {\r\n const newDatabase = new Database(this.name); \r\n const arrayTriggers = await TriggerProcessor.getTriggers(this.name);\r\n newDatabase.setTriggers(arrayTriggers);\r\n return newDatabase;\r\n }\r\n\r\n async connect(): Promise<void> {\r\n const response = await this.engine.run('query_engine', [\r\n '--action', 'connect',\r\n ]);\r\n if (response.status != 200) {\r\n returnFormattedError(response.status, response.message);\r\n }\r\n return response.data;\r\n }\r\n\r\n async disconnect(): Promise<void> {\r\n return this.engine.run('query_engine', [\r\n '--action', 'disconnect',\r\n ]);\r\n }\r\n\r\n /**\r\n * Creates and returns a new instance of `Table` for the specified table.\r\n * This method is used to start building queries for a specific table.\r\n * It provides a fluent interface for common database operations like select, insert, update, and delete.\r\n *\r\n * @param {string} tableName - The name of the table to query.\r\n * @returns {Table} - Returns a new instance of `Table` for the specified table.\r\n *\r\n * @example\r\n * // Select all records from a table\r\n * const users = await db.table('users').get();\r\n * \r\n * // Select records with conditions\r\n * const activeUsers = await db.table('users')\r\n * .where('status', '=', 'active')\r\n * .orderBy('created_at', 'DESC')\r\n * .limit(10)\r\n * .get();\r\n * \r\n * // Insert records\r\n * await db.table('users').insert([\r\n * { name: 'John', email: 'john@example.com', age: 30 }\r\n * ]);\r\n * \r\n * // Update records\r\n * await db.table('users')\r\n * .where('id', '=', 1)\r\n * .update({ status: 'inactive' });\r\n * \r\n * // Delete records\r\n * await db.table('users')\r\n * .where('status', '=', 'deleted')\r\n * .delete();\r\n * \r\n * // Access column management\r\n * const columns = await db.table('users').columns().get();\r\n */\r\n table(tableName: string): Table {\r\n return new Table(this, this.name, tableName, this.engine, this.computedFields, this.triggers);\r\n }\r\n\r\n private setComputedFields(computedFields: any[]){\r\n this.computedFields = computedFields;\r\n }\r\n\r\n private setTriggers(triggers: any[]){\r\n this.triggers = triggers;\r\n }\r\n}\r\n\r\n/**\r\n * Class to build and execute SQL queries for a specific table.\r\n * Supports operations like SELECT, INSERT, UPDATE, DELETE, and more.\r\n */\r\nexport class Table {\r\n private engine: any;\r\n private nextType: 'AND' | 'OR' = 'AND';\r\n private dml: DML;\r\n private computedFields: any[] = [];\r\n private trigger: any;\r\n private triggers: any;\r\n\r\n constructor(instance: any, databaseName: string, tableName: string, engine: any = null, computedFields: any[] = [], triggers: any[] = []) {\r\n this.engine = engine;\r\n this.computedFields = computedFields;\r\n this.triggers = triggers;\r\n this.trigger = new Trigger(instance, databaseName, triggers);\r\n this.nextType = 'AND';\r\n\r\n this.dml = {\r\n type: 'select',\r\n database: databaseName,\r\n table: tableName,\r\n columns: ['*'],\r\n distinct: false,\r\n joins: [],\r\n where: [],\r\n orderBy: [],\r\n groupBy: [],\r\n limit: null,\r\n offset: null,\r\n data: null,\r\n aggregation: null\r\n };\r\n }\r\n\r\n /**\r\n * Specifies the columns to select in a SELECT query.\r\n *\r\n * @param {string[]} fields - Array of column names to select. If empty, selects all columns.\r\n * @returns {Table} - Returns the current instance of Table for method chaining.\r\n *\r\n * @example\r\n * const users = await db.table('users').select(['id', 'name']).get();\r\n * console.log(users); // [{ id: 1, name: 'John' }, { id: 2, name: 'Jane' }]\r\n */\r\n select(fields: string[] = []): Table {\r\n const clone = this.clone();\r\n clone.dml.type = 'select';\r\n clone.dml.columns = fields.length > 0 ? fields : ['*'];\r\n return clone;\r\n }\r\n\r\n /**\r\n * Adds a WHERE condition to the query.\r\n *\r\n * @param {string} column - The column to filter by.\r\n * @param {string} operator - The comparison operator (e.g., '=', '>', '<', 'IS NULL', 'IS NOT NULL').\r\n * @param {any} value - The value to compare against (optional for IS NULL/IS NOT NULL).\r\n * @returns {Table} - Returns the current instance of Table for method chaining.\r\n *\r\n * @example\r\n * const users = await db.table('users').where('age', '>', 25).get();\r\n * const nullUsers = await db.table('users').where('email', 'IS NULL').get();\r\n * console.log(users); // [{ id: 1, name: 'John', age: 30 }]\r\n */\r\n where(column: string, operator: 'IS NULL' | 'IS NOT NULL'): Table;\r\n where(column: string, operator: '=' | '!=' | '<>' | '>' | '<' | '>=' | '<=' | 'LIKE' | 'NOT LIKE' | 'IN' | 'NOT IN' | 'BETWEEN' | 'NOT BETWEEN', value: any): Table;\r\n where(column: string, operator: string, value?: any): Table {\r\n const clone = this.clone();\r\n clone.dml.where.push({\r\n column,\r\n operator,\r\n value,\r\n type: clone.nextType,\r\n isGroup: false\r\n });\r\n clone.nextType = 'AND';\r\n return clone;\r\n }\r\n\r\n /**\r\n * Adds an OR WHERE condition to the query.\r\n *\r\n * @param {string} column - The column to filter by.\r\n * @param {string} operator - The comparison operator (e.g., '=', '>', '<', 'IS NULL', 'IS NOT NULL').\r\n * @param {any} value - The value to compare against (optional for IS NULL/IS NOT NULL).\r\n * @returns {Table} - Returns the current instance of Table for method chaining.\r\n *\r\n * @example\r\n * const users = await db.table('users').where('age', '>', 25).orWhere('name', '=', 'Jane').get();\r\n * const nullUsers = await db.table('users').where('active', '=', true).orWhere('email', 'IS NULL').get();\r\n * console.log(users); // [{ id: 1, name: 'John', age: 30 }, { id: 2, name: 'Jane', age: 25 }]\r\n */\r\n orWhere(column: string, operator: 'IS NULL' | 'IS NOT NULL'): Table;\r\n orWhere(column: string, operator: '=' | '!=' | '<>' | '>' | '<' | '>=' | '<=' | 'LIKE' | 'NOT LIKE' | 'IN' | 'NOT IN' | 'BETWEEN' | 'NOT BETWEEN', value: any): Table;\r\n orWhere(column: string, operator: string, value?: any): Table {\r\n const clone = this.clone();\r\n clone.dml.where.push({\r\n column,\r\n operator,\r\n value,\r\n type: 'OR',\r\n isGroup: false\r\n });\r\n return clone;\r\n }\r\n\r\n /**\r\n * Adds a grouped WHERE condition to the query.\r\n *\r\n * @param {WhereCallback} callback - A callback function that receives a new Table instance to build the grouped conditions.\r\n * @returns {Table} - Returns the current instance of Table for method chaining.\r\n *\r\n * @example\r\n * const users = await db.table('users').whereGroup(query => {\r\n * query.where('age', '>', 25).orWhere('name', '=', 'Jane');\r\n * }).get();\r\n * console.log(users); // [{ id: 1, name: 'John', age: 30 }, { id: 2, name: 'Jane', age: 25 }]\r\n */\r\n whereGroup(callback: WhereCallback): Table {\r\n const clone = this.clone();\r\n const groupQuery = new Table(clone.dml.database, clone.dml.table, clone.engine);\r\n callback(groupQuery);\r\n\r\n clone.dml.where.push({\r\n type: clone.nextType,\r\n isGroup: true,\r\n conditions: groupQuery.dml.where as WhereCondition[]\r\n });\r\n clone.nextType = 'AND';\r\n return clone;\r\n }\r\n\r\n or(): Table {\r\n const clone = this.clone();\r\n clone.nextType = 'OR';\r\n return clone;\r\n }\r\n\r\n and(): Table {\r\n const clone = this.clone();\r\n clone.nextType = 'AND';\r\n return clone;\r\n }\r\n\r\n /**\r\n * Adds a WHERE BETWEEN condition to the query.\r\n *\r\n * @param {string} column - The column to filter by.\r\n * @param {[any, any]} values - A tuple with two values representing the range.\r\n * @returns {Table} - Returns the current instance of Table for method chaining.\r\n *\r\n * @example\r\n * const users = await db.table('users').whereBetween('age', [20, 30]).get();\r\n * console.log(users); // [{ id: 1, name: 'John', age: 30 }, { id: 2, name: 'Jane', age: 25 }]\r\n */\r\n whereBetween(column: string, values: [any, any]): Table {\r\n const clone = this.clone();\r\n const [value1, value2] = values;\r\n if (value1 !== undefined && value2 !== undefined) {\r\n clone.dml.where.push({\r\n column,\r\n operator: 'BETWEEN',\r\n value: [value1, value2],\r\n type: clone.nextType,\r\n isGroup: false\r\n });\r\n clone.nextType = 'AND';\r\n }\r\n return clone;\r\n }\r\n\r\n /**\r\n * Adds a WHERE IN condition to the query.\r\n *\r\n * @param {string} column - The column to filter by.\r\n * @param {any[]} values - An array of values to match.\r\n * @returns {Table} - Returns the current instance of Table for method chaining.\r\n *\r\n * @example\r\n * const users = await db.table('users').whereIn('id', [1, 2]).get();\r\n * console.log(users); // [{ id: 1, name: 'John' }, { id: 2, name: 'Jane' }]\r\n */\r\n whereIn(column: string, values: any[]): Table {\r\n const clone = this.clone();\r\n if (Array.isArray(values) && values.length > 0) {\r\n clone.dml.where.push({\r\n column,\r\n operator: 'IN',\r\n value: values,\r\n type: clone.nextType,\r\n isGroup: false\r\n });\r\n clone.nextType = 'AND';\r\n }\r\n return clone;\r\n }\r\n\r\n /**\r\n * Adds a WHERE IS NULL condition to the query.\r\n *\r\n * @param {string} column - The column to filter by.\r\n * @returns {Table} - Returns the current instance of Table for method chaining.\r\n *\r\n * @example\r\n * const users = await db.table('users').whereNull('email').get();\r\n * console.log(users); // [{ id: 3, name: 'Alice', email: null }]\r\n */\r\n whereNull(column: string): Table {\r\n const clone = this.clone();\r\n clone.dml.where.push({\r\n column,\r\n operator: 'IS NULL',\r\n type: clone.nextType,\r\n isGroup: false\r\n });\r\n clone.nextType = 'AND';\r\n return clone;\r\n }\r\n\r\n /**\r\n * Adds a WHERE IS NOT NULL condition to the query.\r\n *\r\n * @param {string} column - The column to filter by.\r\n * @returns {Table} - Returns the current instance of Table for method chaining.\r\n *\r\n * @example\r\n * const users = await db.table('users').whereNotNull('email').get();\r\n * console.log(users); // [{ id: 1, name: 'John', email: 'john@example.com' }]\r\n */\r\n whereNotNull(column: string): Table {\r\n const clone = this.clone();\r\n clone.dml.where.push({\r\n column,\r\n operator: 'IS NOT NULL',\r\n type: clone.nextType,\r\n isGroup: false\r\n });\r\n clone.nextType = 'AND';\r\n return clone;\r\n }\r\n\r\n /**\r\n * Adds a JOIN clause to the query.\r\n *\r\n * @param {string} table - The table to join.\r\n * @param {string} column1 - The column from the current table.\r\n * @param {string} operator - The comparison operator (e.g., '=', '>', '<').\r\n * @param {string} column2 - The column from the joined table.\r\n * @returns {Table} - Returns the current instance of Table for method chaining.\r\n *\r\n * @example\r\n * const users = await db.table('users').join('orders', 'users.id', '=', 'orders.user_id').get();\r\n * console.log(users); // [{ id: 1, name: 'John', order_id: 101 }]\r\n */\r\n join(table: string, column1: string, operator: string, column2: string): Table {\r\n const clone = this.clone();\r\n clone.dml.joins.push({\r\n type: 'INNER',\r\n table,\r\n on: {\r\n column1,\r\n operator,\r\n column2\r\n }\r\n });\r\n return clone;\r\n }\r\n\r\n /**\r\n * Adds a LEFT JOIN clause to the query.\r\n *\r\n * @param {string} table - The table to join.\r\n * @param {string} column1 - The column from the current table.\r\n * @param {string} operator - The comparison operator (e.g., '=', '>', '<').\r\n * @param {string} column2 - The column from the joined table.\r\n * @returns {Table} - Returns the current instance of Table for method chaining.\r\n *\r\n * @example\r\n * const users = await db.table('users').leftJoin('orders', 'users.id', '=', 'orders.user_id').get();\r\n * console.log(users); // [{ id: 1, name: 'John', order_id: 101 }, { id: 2, name: 'Jane', order_id: null }]\r\n */\r\n leftJoin(table: string, column1: string, operator: string, column2: string): Table {\r\n const clone = this.clone();\r\n clone.dml.joins.push({\r\n type: 'LEFT',\r\n table,\r\n on: {\r\n column1,\r\n operator,\r\n column2\r\n }\r\n });\r\n return clone;\r\n }\r\n\r\n /**\r\n * Adds a RIGHT JOIN clause to the query.\r\n *\r\n * @param {string} table - The table to join.\r\n * @param {string} column1 - The column from the current table.\r\n * @param {string} operator - The comparison operator (e.g., '=', '>', '<').\r\n * @param {string} column2 - The column from the joined table.\r\n * @returns {Table} - Returns the current instance of Table for method chaining.\r\n *\r\n * @example\r\n * const users = await db.table('users').rightJoin('orders', 'users.id', '=', 'orders.user_id').get();\r\n * console.log(users); // [{ id: 1, name: 'John', order_id: 101 }, { id: null, name: null, order_id: 102 }]\r\n */\r\n rightJoin(table: string, column1: string, operator: string, column2: string): Table {\r\n const clone = this.clone();\r\n clone.dml.joins.push({\r\n type: 'RIGHT',\r\n table,\r\n on: {\r\n column1,\r\n operator,\r\n column2\r\n }\r\n });\r\n return clone;\r\n }\r\n\r\n /**\r\n * Adds an ORDER BY clause to the query.\r\n *\r\n * @param {string} column - The column to order by.\r\n * @param {'ASC' | 'DESC'} direction - The sorting direction ('ASC' or 'DESC').\r\n * @returns {Table} - Returns the current instance of Table for method chaining.\r\n *\r\n * @example\r\n * const users = await db.table('users').orderBy('name', 'ASC').get();\r\n * console.log(users); // [{ id: 2, name: 'Jane' }, { id: 1, name: 'John' }]\r\n */\r\n orderBy(column: string, direction: 'ASC' | 'DESC' = 'ASC'): Table {\r\n const clone = this.clone();\r\n const validDirections: ('ASC' | 'DESC')[] = ['ASC', 'DESC'];\r\n if (validDirections.includes(direction.toUpperCase() as 'ASC' | 'DESC')) {\r\n clone.dml.orderBy.push({\r\n column,\r\n direction: direction.toUpperCase() as 'ASC' | 'DESC'\r\n });\r\n } else {\r\n throw new Error(`Invalid direction: ${direction}. Use 'ASC' or 'DESC'.`);\r\n }\r\n return clone;\r\n }\r\n\r\n /**\r\n * Adds a GROUP BY clause to the query.\r\n *\r\n * @param {string} column - The column to group by.\r\n * @returns {Table} - Returns the current instance of Table for method chaining.\r\n *\r\n * @example\r\n * const users = await db.table('users').groupBy('age').get();\r\n * console.log(users); // [{ age: 30, count: 1 }, { age: 25, count: 1 }]\r\n */\r\n groupBy(column: string): Table {\r\n const clone = this.clone();\r\n clone.dml.groupBy.push(column);\r\n return clone;\r\n }\r\n\r\n /**\r\n * Adds a DISTINCT clause to the query.\r\n *\r\n * @returns {Table} - Returns the current instance of Table for method chaining.\r\n *\r\n * @example\r\n * const users = await db.table('users').distinct().select(['name']).get();\r\n * console.log(users); // [{ name: 'John' }, { name: 'Jane' }]\r\n */\r\n distinct(): Table {\r\n const clone = this.clone();\r\n clone.dml.distinct = true;\r\n return clone;\r\n }\r\n\r\n /**\r\n * Adds a COUNT clause to the query.\r\n *\r\n * @param {string} column - The column to count (default is '*').\r\n * @returns {Table} - Returns the current instance of Table for method chaining.\r\n *\r\n * @example\r\n * const count = await db.table('users').count().first();\r\n * console.log(count); // { count: 2 }\r\n */\r\n async count(column: string = '*'): Promise<Number> {\r\n this.dml.type = 'select';\r\n this.dml.aggregation = {\r\n type: 'COUNT',\r\n column,\r\n alias: 'count'\r\n };\r\n this.dml.columns = [`COUNT(${column}) AS count`];\r\n this.dml.data = null;\r\n this.dml.limit = 1;\r\n try {\r\n const result = await this.getResponse();\r\n const res = result[0] || null;\r\n if(res){\r\n return res.count;\r\n }\r\n return 0;\r\n }\r\n catch (error) {\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Adds a SUM clause to the query.\r\n *\r\n * @param {string} column - The column to sum.\r\n * @returns {Table} - Returns the current instance of Table for method chaining.\r\n *\r\n * @example\r\n * const totalAge = await db.table('users').sum('age').first();\r\n * console.log(totalAge); // { sum: 55 }\r\n */\r\n async sum(column: string): Promise<Number> {\r\n this.dml.type = 'select';\r\n this.dml.aggregation = {\r\n type: 'SUM',\r\n column,\r\n alias: 'sum'\r\n };\r\n this.dml.columns = [`SUM(${column}) AS sum`];\r\n this.dml.data = null;\r\n this.dml.limit = 1;\r\n try {\r\n const result = await this.getResponse();\r\n const res = result[0] || null;\r\n if(res){\r\n return res.sum;\r\n }\r\n return 0;\r\n }\r\n catch (error) {\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Adds an AVG clause to the query.\r\n *\r\n * @param {string} column - The column to calculate the average.\r\n * @returns {Table} - Returns the current instance of Table for method chaining.\r\n *\r\n * @example\r\n * const avgAge = await db.table('users').avg('age').first();\r\n * console.log(avgAge); // { avg: 27.5 }\r\n */\r\n async avg(column: string): Promise<Number> {\r\n this.dml.type = 'select';\r\n this.dml.aggregation = {\r\n type: 'AVG',\r\n column,\r\n alias: 'avg'\r\n };\r\n this.dml.columns = [`AVG(${column}) AS avg`];\r\n this.dml.data = null;\r\n this.dml.limit = 1;\r\n try {\r\n const result = await this.getResponse();\r\n const res = result[0] || null;\r\n if(res){\r\n return res.avg;\r\n }\r\n return 0;\r\n }\r\n catch (error) {\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Adds a MAX clause to the query.\r\n *\r\n * @param {string} column - The column to find the maximum value.\r\n * @returns {Table} - Returns the current instance of Table for method chaining.\r\n *\r\n * @example\r\n * const maxAge = await db.table('users').max('age').first();\r\n * console.log(maxAge); // { max: 30 }\r\n */\r\n async max(column: string): Promise<Number> {\r\n this.dml.type = 'select';\r\n this.dml.aggregation = {\r\n type: 'MAX',\r\n column,\r\n alias: 'max'\r\n };\r\n this.dml.columns = [`MAX(${column}) AS max`];\r\n this.dml.data = null;\r\n this.dml.limit = 1;\r\n try {\r\n const result = await this.getResponse();\r\n const res = result[0] || null;\r\n if(res){\r\n return res.max;\r\n }\r\n return 0;\r\n }\r\n catch (error) {\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Adds a MIN clause to the query.\r\n *\r\n * @param {string} column - The column to find the minimum value.\r\n * @returns {Table} - Returns the current instance of Table for method chaining.\r\n *\r\n * @example\r\n * const minAge = await db.table('users').min('age').first();\r\n * console.log(minAge); // { min: 25 }\r\n */\r\n async min(column: string): Promise<Number> {\r\n this.dml.type = 'select';\r\n this.dml.aggregation = {\r\n type: 'MIN',\r\n column,\r\n alias: 'min'\r\n };\r\n this.dml.columns = [`MIN(${column}) AS min`];\r\n this.dml.data = null;\r\n this.dml.limit = 1;\r\n try {\r\n const result = await this.getResponse();\r\n const res = result[0] || null;\r\n if(res){\r\n return res.min;\r\n }\r\n return 0;\r\n }\r\n catch (error) {\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Adds a LIMIT clause to the query.\r\n *\r\n * @param {number} number - The maximum number of rows to return.\r\n * @returns {Table} - Returns the current instance of Table for method chaining.\r\n *\r\n * @example\r\n * const users = await db.table('users').limit(1).get();\r\n * console.log(users); // [{ id: 1, name: 'John', age: 30 }]\r\n */\r\n limit(number: number): Table {\r\n const clone = this.clone();\r\n clone.dml.limit = number;\r\n return clone;\r\n }\r\n\r\n /**\r\n * Adds pagination to the query using LIMIT and OFFSET.\r\n *\r\n * @param {number} number - The page number (starting from 1).\r\n * @returns {Table} - Returns the current instance of Table for method chaining.\r\n *\r\n * @example\r\n * const users = await db.table('users').limit(1).page(2).get();\r\n * console.log(users); // [{ id: 2, name: 'Jane', age: 25 }]\r\n */\r\n page(number: number): Table {\r\n const clone = this.clone();\r\n if (clone.dml.limit) {\r\n clone.dml.offset = (number - 1) * clone.dml.limit;\r\n }\r\n return clone;\r\n }\r\n\r\n /**\r\n * Executes the query and returns all matching rows.\r\n *\r\n * @returns {Promise<DatabaseRecord[]>} - Returns an array of rows.\r\n *\r\n * @example\r\n * const users = await db.table('users').get();\r\n * console.log(users); // [{ id: 1, name: 'John' }, { id: 2, name: 'Jane' }]\r\n */\r\n async get(): Promise<DatabaseRecord[]> {\r\n try {\r\n this.dml.type = 'select';\r\n this.dml.data = null;\r\n const result = await this.getResponse();\r\n return result;\r\n }\r\n catch (error) {\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Executes the query and returns the first matching row.\r\n *\r\n * @returns {Promise<DatabaseRecord | null>} - Returns the first row or null if no rows match.\r\n *\r\n * @example\r\n * const user = await db.table('users').first();\r\n * console.log(user); // { id: 1, name: 'John' }\r\n */\r\n async first(): Promise<DatabaseRecord | null> {\r\n this.dml.type = 'select';\r\n this.dml.data = null;\r\n this.dml.limit = 1;\r\n try {\r\n const result = await this.getResponse();\r\n return result[0] || null;\r\n }\r\n catch (error) {\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Finds a row by a specific column value.\r\n *\r\n * @param {any} value - The value to search for.\r\n * @param {string} column - The column to search in (default is 'id').\r\n * @returns {Promise<DatabaseRecord | null>} - Returns the first matching row or null if no rows match.\r\n *\r\n * @example\r\n * const user = await db.table('users').find(1);\r\n * console.log(user); // { id: 1, name: 'John' }\r\n */\r\n async find(value: any, column: string = 'id'): Promise<DatabaseRecord | null> {\r\n this.dml.type = 'select';\r\n this.dml.data = null;\r\n this.where(column, '=', value);\r\n this.dml.limit = 1;\r\n try {\r\n const result = await this.getResponse();\r\n return result[0] || null;\r\n }\r\n catch (error) {\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Inserts one or more rows into the table.\r\n *\r\n * @param {DatabaseRecord[]} data - An array of objects representing the rows to insert.\r\n * @returns {Promise<DatabaseRecord[]>} - Returns an array of the inserted rows.\r\n *\r\n * @example\r\n * const newUsers = await db.table('users').insert([\r\n * { name: 'Alice', age: 28 },\r\n * { name: 'Bob', age: 32 }\r\n * ]);\r\n * console.log(newUsers); // [{ id: 3, name: 'Alice', age: 28 }, { id: 4, name: 'Bob', age: 32 }]\r\n */\r\n async insert(data: DatabaseRecord[]): Promise<DatabaseRecord[]> {\r\n if (!Array.isArray(data)) {\r\n throw new Error('The insert method requires an array of objects with key-value pairs.');\r\n }\r\n\r\n if (!data.every(item => typeof item === 'object' && item !== null)) {\r\n throw new Error('The array must contain only valid objects.');\r\n }\r\n\r\n this.dml.type = 'insert';\r\n this.dml.data = data;\r\n\r\n await this.getResponse(this.dml, 'Add');\r\n\r\n return data;\r\n }\r\n\r\n /**\r\n * Updates rows in the table based on the defined conditions.\r\n *\r\n * @param {DatabaseRecord} data - An object with key-value pairs representing the fields to update.\r\n * @returns {Promise<any>} - Returns the result of the update operation.\r\n *\r\n * @example\r\n * const result = await db.table('users')\r\n * .where('id', '=', 1)\r\n * .update({ name: 'John Updated', age: 31 });\r\n * console.log(result); // { affectedRows: 1 }\r\n */\r\n async update(data: DatabaseRecord): Promise<any> {\r\n if (typeof data !== 'object' || Array.isArray(data)) {\r\n throw new Error('The update method requires an object with key-value pairs.');\r\n }\r\n\r\n if (this.dml.where.length === 0) {\r\n throw new Error('You must specify at least one WHERE condition to perform an update.');\r\n }\r\n\r\n this.dml.type = 'update';\r\n this.dml.data = data;\r\n\r\n await this.getResponse(this.dml, 'Update');\r\n\r\n return data;\r\n }\r\n\r\n /**\r\n * Deletes rows from the table based on the defined conditions.\r\n *\r\n * @returns {Promise<any>} - Returns the result of the delete operation.\r\n *\r\n * @example\r\n * const result = await db.table('users').where('id', '=', 1).delete();\r\n * console.log(result); // { affectedRows: 1 }\r\n */\r\n async delete(): Promise<any> {\r\n if (this.dml.where.length === 0) {\r\n throw new Error('You must specify at least one WHERE condition to perform a delete.');\r\n }\r\n\r\n this.dml.type = 'delete';\r\n\r\n const deleteData = await this.getResponse(this.dml, 'Delete');\r\n return deleteData;\r\n }\r\n\r\n private async getResponse(dml: any = null, type: any = null): Promise<any> {\r\n const localDML = dml ? dml : this.dml;\r\n const computedFieldsNeeded: any[] = [];\r\n let dependeciesArrray: any[] = [];\r\n\r\n if (this.computedFields.length > 0) {\r\n let columns = localDML.columns;\r\n\r\n for (const field of localDML.columns) {\r\n const computedField = this.computedFields.find(cf => cf.column === field);\r\n\r\n if (computedField) {\r\n computedFieldsNeeded.push(computedField);\r\n // Add dependencies to real fields\r\n const dependencies = ComputedFieldProcessor.extractDependencies(computedField.instruction);\r\n dependeciesArrray = [...dependeciesArrray, ...dependencies];\r\n columns = Array.from(new Set([...columns, ...dependencies]));\r\n columns = columns.filter((col: string) => col != field);\r\n }\r\n }\r\n localDML.columns = columns;\r\n }\r\n\r\n let arrayResult = [];\r\n if (type) {\r\n const beffore = this.trigger.get('before' + type);\r\n const after = this.trigger.get('after' + type);\r\n if (this.triggers.length > 0 && (beffore || after)) {\r\n const dataset = localDML.data;\r\n for (let index = 0; index < dataset.length; index++) {\r\n const data = dataset[index];\r\n const newDML = { ...localDML, data: [data] };\r\n if (beffore) {\r\n const interceptor = await this.trigger.execute('before' + type, data);\r\n const response = await this.engine.run('query_engine', [\r\n '--action', 'execute',\r\n '--dml', JSON.stringify(newDML)\r\n ]);\r\n\r\n if (response.status != 200) {\r\n interceptor.discard();\r\n returnFormattedError(response.status, response.message);\r\n }\r\n await interceptor.commit();\r\n arrayResult = response.data;\r\n }\r\n if (after) {\r\n\r\n const response = await this.engine.run('query_engine', [\r\n '--action', 'execute',\r\n '--dml', JSON.stringify(newDML)\r\n ]);\r\n\r\n if (response.status != 200) {\r\n returnFormattedError(response.status, response.message);\r\n }\r\n const interceptor = await this.trigger.execute('after' + type, data);\r\n await interceptor.commit();\r\n }\r\n }\r\n } else {\r\n const response = await this.engine.run('query_engine', [\r\n '--action', 'execute',\r\n '--dml', JSON.stringify(localDML)\r\n ]);\r\n\r\n if (response.status != 200) {\r\n returnFormattedError(response.status, response.message);\r\n }\r\n\r\n arrayResult = response.data;\r\n }\r\n } else {\r\n const response = await this.engine.run('query_engine', [\r\n '--action', 'execute',\r\n '--dml', JSON.stringify(localDML)\r\n ]);\r\n\r\n if (response.status != 200) {\r\n returnFormattedError(response.status, response.message);\r\n }\r\n\r\n arrayResult = response.data;\r\n }\r\n\r\n if (computedFieldsNeeded.length > 0) {\r\n let newDataset: any = ComputedFieldProcessor.computedFields(arrayResult, computedFieldsNeeded);\r\n const result = newDataset.map((obj: any) => {\r\n const newObj = { ...obj };\r\n dependeciesArrray.forEach(key => delete newObj[key]);\r\n return newObj;\r\n });\r\n return result;\r\n }\r\n\r\n return arrayResult;\r\n }\r\n\r\n private clone(): Table {\r\n const cloned = Object.create(Object.getPrototypeOf(this));\r\n cloned.engine = this.engine;\r\n cloned.nextType = this.nextType;\r\n cloned.computedFields = this.computedFields;\r\n cloned.trigger = this.trigger;\r\n cloned.triggers = this.triggers;\r\n cloned.dml = {\r\n ...this.dml,\r\n columns: [...this.dml.columns],\r\n joins: [...this.dml.joins],\r\n where: [...this.dml.where],\r\n orderBy: [...this.dml.orderBy],\r\n groupBy: [...this.dml.groupBy]\r\n };\r\n return cloned;\r\n }\r\n\r\n}\r\n\r\nfunction returnFormattedError(status: number, message: string) {\r\n const RESET = '\\x1b[0m';\r\n const RED = '\\x1b[31m';\r\n const YELLOW = '\\x1b[33m';\r\n const BOLD = '\\x1b[1m';\r\n const CYAN = '\\x1b[36m';\r\n const GRAY = '\\x1b[90m';\r\n const UNDERLINE = '\\x1b[4m';\r\n const MAGENTA = '\\x1b[35m';\r\n\r\n let output = '';\r\n let help = '';\r\n const color = status === 600 ? YELLOW : RED;\r\n\r\n\r\n if (message.includes(\"[help]\")) {\r\n const parts = message.split(\"[help]\");\r\n output += `\\n${RED}${BOLD}${parts[0]}${RESET}`;\r\n help += `\\n${MAGENTA}${BOLD}[help]${RESET} ${GRAY}${parts[1]}${RESET}\\n`;\r\n } else {\r\n output += `\\n${color}${BOLD}${message}${RESET}\\n`;\r\n }\r\n\r\n const err = new Error();\r\n const stackLines = err.stack?.split('\\n') || [];\r\n\r\n // Buscamos la primera línea del stack fuera de node_modules\r\n const relevantStackLine = stackLines.find(line =>\r\n line.includes('.js:') && !line.includes('node_modules')\r\n );\r\n\r\n if (relevantStackLine) {\r\n const match = relevantStackLine.match(/\\((.*):(\\d+):(\\d+)\\)/) ||\r\n relevantStackLine.match(/at (.*):(\\d+):(\\d+)/);\r\n\r\n if (match) {\r\n const [, filePath, lineStr, columnStr] = match;\r\n const lineNum = parseInt(lineStr, 10);\r\n const errorLocation = `${filePath}:${lineStr}:${columnStr}`;\r\n\r\n // Leemos el archivo y sacamos las líneas relevantes\r\n try {\r\n const codeLines = fs.readFileSync(filePath, 'utf-8').split('\\n');\r\n const start = Math.max(0, lineNum - 3);\r\n const end = Math.min(codeLines.length, lineNum + 2);\r\n\r\n output += `\\n${CYAN}${BOLD}[code] ${RESET}${YELLOW} ${UNDERLINE}${errorLocation}${RESET}\\n`;\r\n\r\n for (let i = start; i < end; i++) {\r\n const line = codeLines[i];\r\n const lineLabel = `${i + 1}`.padStart(4, ' ');\r\n const pointer = i + 1 === lineNum ? `${RED}<-${RESET}` : ' ';\r\n output += `${GRAY}${lineLabel}${RESET} ${pointer} ${line}\\n`;\r\n }\r\n } catch (err) {\r\n output += `${YELLOW}⚠️ No se pudo leer el archivo de origen: ${filePath}${RESET}\\n`;\r\n output += `\\n${CYAN}${BOLD}Stack Trace:${RESET}\\n${stackLines.slice(2).join('\\n')}\\n`;\r\n }\r\n }\r\n }\r\n output += help;\r\n console.error(output);\r\n}\r\n\r\nexport default Database;\r\n","import path from \"path\";\r\nimport { FileLogger } from \"@dbcube/core\";\r\nimport { createRequire } from 'module';\r\n\r\nexport class Trigger{\r\n private triggers: any[];\r\n private databaseName: string;\r\n private instance: any;\r\n\r\n constructor(instance:any, databaseName:string, metadata: any[]){\r\n this.triggers = metadata;\r\n this.databaseName = databaseName;\r\n this.instance = instance;\r\n }\r\n\r\n get(type:string){\r\n return this.triggers.find((tr:any)=> tr.type === type);\r\n }\r\n\r\n async execute(type: string, row:any){\r\n const trigger = this.triggers.find((tr:any)=> tr.type === type);\r\n if (trigger) {\r\n const logFilePath = path.resolve(\r\n process.cwd(),\r\n 'dbcube',\r\n 'logs',\r\n 'triggers',\r\n this.databaseName,\r\n `${trigger.table_ref}_${trigger.type}.log`\r\n );\r\n \r\n const interceptor = FileLogger.interceptConsole(logFilePath, {\r\n keepOriginal: false,\r\n useBuffer: true\r\n });\r\n const pathFile = path.resolve(process.cwd(), 'dbcube', 'triggers', `${trigger.database_ref}_${trigger.table_ref}_${trigger.type}.js`);\r\n // Use __filename for CJS, process.cwd() for ESM\r\n const requireUrl = typeof __filename !== 'undefined' ? __filename : process.cwd();\r\n const require = createRequire(requireUrl);\r\n // Clear require cache to ensure fresh load\r\n delete require.cache[require.resolve(pathFile)];\r\n const triggerModule = require(pathFile);\r\n const dataProcess = triggerModule.default || triggerModule;\r\n await dataProcess({db: this.instance, oldData: row, newData: row});\r\n interceptor.restore(); \r\n return interceptor;\r\n }\r\n return null;\r\n }\r\n}","import { Table, Database } from './lib/Database';\r\nimport type { DatabaseRecord, WhereCallback } from './@types/Database';\r\n\r\nexport default Database;\r\nexport { \r\n Table, \r\n Database,\r\n type DatabaseRecord,\r\n type WhereCallback\r\n};"],"mappings":"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","names":["require","err"]}
1
+ {"version":3,"sources":["../src/lib/Database.ts","../src/lib/Trigger.ts","../src/index.ts"],"sourcesContent":["import fs from 'fs';\r\nimport { QueryEngine, ComputedFieldProcessor, TriggerProcessor } from \"@dbcube/core\";\r\nimport { DatabaseRecord, DML, WhereCallback, WhereCondition } from \"../@types/Database\";\r\nimport { Trigger } from './Trigger';\r\n\r\n/**\r\n * Main class to handle MySQL database connections and queries.\r\n * Implements the Singleton pattern to ensure a single instance of the connection pool.\r\n */\r\nexport class Database {\r\n private name: string;\r\n private engine: any;\r\n private computedFields: any[];\r\n private triggers: any[];\r\n\r\n constructor(name: string) {\r\n this.name = name;\r\n const engine = new QueryEngine(name);\r\n this.engine = engine;\r\n this.computedFields = [];\r\n this.triggers = [];\r\n }\r\n\r\n async useComputes(): Promise<Database> {\r\n const newDatabase = new Database(this.name); \r\n const arrayComputedFields = await ComputedFieldProcessor.getComputedFields(this.name);\r\n newDatabase.setComputedFields(arrayComputedFields);\r\n return newDatabase;\r\n }\r\n\r\n async useTriggers(): Promise<Database> {\r\n const newDatabase = new Database(this.name); \r\n const arrayTriggers = await TriggerProcessor.getTriggers(this.name);\r\n newDatabase.setTriggers(arrayTriggers);\r\n return newDatabase;\r\n }\r\n\r\n async connect(): Promise<void> {\r\n const response = await this.engine.run('query_engine', [\r\n '--action', 'connect',\r\n ]);\r\n if (response.status != 200) {\r\n returnFormattedError(response.status, response.message);\r\n }\r\n return response.data;\r\n }\r\n\r\n async disconnect(): Promise<void> {\r\n return this.engine.run('query_engine', [\r\n '--action', 'disconnect',\r\n ]);\r\n }\r\n\r\n /**\r\n * Creates and returns a new instance of `Table` for the specified table.\r\n * This method is used to start building queries for a specific table.\r\n * It provides a fluent interface for common database operations like select, insert, update, and delete.\r\n *\r\n * @param {string} tableName - The name of the table to query.\r\n * @returns {Table} - Returns a new instance of `Table` for the specified table.\r\n *\r\n * @example\r\n * // Select all records from a table\r\n * const users = await db.table('users').get();\r\n * \r\n * // Select records with conditions\r\n * const activeUsers = await db.table('users')\r\n * .where('status', '=', 'active')\r\n * .orderBy('created_at', 'DESC')\r\n * .limit(10)\r\n * .get();\r\n * \r\n * // Insert records\r\n * await db.table('users').insert([\r\n * { name: 'John', email: 'john@example.com', age: 30 }\r\n * ]);\r\n * \r\n * // Update records\r\n * await db.table('users')\r\n * .where('id', '=', 1)\r\n * .update({ status: 'inactive' });\r\n * \r\n * // Delete records\r\n * await db.table('users')\r\n * .where('status', '=', 'deleted')\r\n * .delete();\r\n * \r\n * // Access column management\r\n * const columns = await db.table('users').columns().get();\r\n */\r\n table(tableName: string): Table {\r\n return new Table(this, this.name, tableName, this.engine, this.computedFields, this.triggers);\r\n }\r\n\r\n private setComputedFields(computedFields: any[]){\r\n this.computedFields = computedFields;\r\n }\r\n\r\n private setTriggers(triggers: any[]){\r\n this.triggers = triggers;\r\n }\r\n}\r\n\r\n/**\r\n * Class to build and execute SQL queries for a specific table.\r\n * Supports operations like SELECT, INSERT, UPDATE, DELETE, and more.\r\n */\r\nexport class Table {\r\n private engine: any;\r\n private nextType: 'AND' | 'OR' = 'AND';\r\n private dml: DML;\r\n private computedFields: any[] = [];\r\n private trigger: any;\r\n private triggers: any;\r\n\r\n constructor(instance: any, databaseName: string, tableName: string, engine: any = null, computedFields: any[] = [], triggers: any[] = []) {\r\n this.engine = engine;\r\n this.computedFields = computedFields;\r\n this.triggers = triggers;\r\n this.trigger = new Trigger(instance, databaseName, triggers);\r\n this.nextType = 'AND';\r\n\r\n this.dml = {\r\n type: 'select',\r\n database: databaseName,\r\n table: tableName,\r\n columns: ['*'],\r\n distinct: false,\r\n joins: [],\r\n where: [],\r\n orderBy: [],\r\n groupBy: [],\r\n limit: null,\r\n offset: null,\r\n data: null,\r\n aggregation: null\r\n };\r\n }\r\n\r\n /**\r\n * Specifies the columns to select in a SELECT query.\r\n *\r\n * @param {string[]} fields - Array of column names to select. If empty, selects all columns.\r\n * @returns {Table} - Returns the current instance of Table for method chaining.\r\n *\r\n * @example\r\n * const users = await db.table('users').select(['id', 'name']).get();\r\n * console.log(users); // [{ id: 1, name: 'John' }, { id: 2, name: 'Jane' }]\r\n */\r\n select(fields: string[] = []): Table {\r\n const clone = this.clone();\r\n clone.dml.type = 'select';\r\n clone.dml.columns = fields.length > 0 ? fields : ['*'];\r\n return clone;\r\n }\r\n\r\n /**\r\n * Adds a WHERE condition to the query.\r\n *\r\n * @param {string} column - The column to filter by.\r\n * @param {string} operator - The comparison operator (e.g., '=', '>', '<', 'IS NULL', 'IS NOT NULL').\r\n * @param {any} value - The value to compare against (optional for IS NULL/IS NOT NULL).\r\n * @returns {Table} - Returns the current instance of Table for method chaining.\r\n *\r\n * @example\r\n * const users = await db.table('users').where('age', '>', 25).get();\r\n * const nullUsers = await db.table('users').where('email', 'IS NULL').get();\r\n * console.log(users); // [{ id: 1, name: 'John', age: 30 }]\r\n */\r\n where(column: string, operator: 'IS NULL' | 'IS NOT NULL'): Table;\r\n where(column: string, operator: '=' | '!=' | '<>' | '>' | '<' | '>=' | '<=' | 'LIKE' | 'NOT LIKE' | 'IN' | 'NOT IN' | 'BETWEEN' | 'NOT BETWEEN', value: any): Table;\r\n where(column: string, operator: string, value?: any): Table {\r\n const clone = this.clone();\r\n clone.dml.where.push({\r\n column,\r\n operator,\r\n value,\r\n type: clone.nextType,\r\n isGroup: false\r\n });\r\n clone.nextType = 'AND';\r\n return clone;\r\n }\r\n\r\n /**\r\n * Adds an OR WHERE condition to the query.\r\n *\r\n * @param {string} column - The column to filter by.\r\n * @param {string} operator - The comparison operator (e.g., '=', '>', '<', 'IS NULL', 'IS NOT NULL').\r\n * @param {any} value - The value to compare against (optional for IS NULL/IS NOT NULL).\r\n * @returns {Table} - Returns the current instance of Table for method chaining.\r\n *\r\n * @example\r\n * const users = await db.table('users').where('age', '>', 25).orWhere('name', '=', 'Jane').get();\r\n * const nullUsers = await db.table('users').where('active', '=', true).orWhere('email', 'IS NULL').get();\r\n * console.log(users); // [{ id: 1, name: 'John', age: 30 }, { id: 2, name: 'Jane', age: 25 }]\r\n */\r\n orWhere(column: string, operator: 'IS NULL' | 'IS NOT NULL'): Table;\r\n orWhere(column: string, operator: '=' | '!=' | '<>' | '>' | '<' | '>=' | '<=' | 'LIKE' | 'NOT LIKE' | 'IN' | 'NOT IN' | 'BETWEEN' | 'NOT BETWEEN', value: any): Table;\r\n orWhere(column: string, operator: string, value?: any): Table {\r\n const clone = this.clone();\r\n clone.dml.where.push({\r\n column,\r\n operator,\r\n value,\r\n type: 'OR',\r\n isGroup: false\r\n });\r\n return clone;\r\n }\r\n\r\n /**\r\n * Adds a grouped WHERE condition to the query.\r\n *\r\n * @param {WhereCallback} callback - A callback function that receives a new Table instance to build the grouped conditions.\r\n * @returns {Table} - Returns the current instance of Table for method chaining.\r\n *\r\n * @example\r\n * const users = await db.table('users').whereGroup(query => {\r\n * query.where('age', '>', 25).orWhere('name', '=', 'Jane');\r\n * }).get();\r\n * console.log(users); // [{ id: 1, name: 'John', age: 30 }, { id: 2, name: 'Jane', age: 25 }]\r\n */\r\n whereGroup(callback: WhereCallback): Table {\r\n const clone = this.clone();\r\n const groupQuery = new Table(clone.dml.database, clone.dml.table, clone.engine);\r\n callback(groupQuery);\r\n\r\n clone.dml.where.push({\r\n type: clone.nextType,\r\n isGroup: true,\r\n conditions: groupQuery.dml.where as WhereCondition[]\r\n });\r\n clone.nextType = 'AND';\r\n return clone;\r\n }\r\n\r\n or(): Table {\r\n const clone = this.clone();\r\n clone.nextType = 'OR';\r\n return clone;\r\n }\r\n\r\n and(): Table {\r\n const clone = this.clone();\r\n clone.nextType = 'AND';\r\n return clone;\r\n }\r\n\r\n /**\r\n * Adds a WHERE BETWEEN condition to the query.\r\n *\r\n * @param {string} column - The column to filter by.\r\n * @param {[any, any]} values - A tuple with two values representing the range.\r\n * @returns {Table} - Returns the current instance of Table for method chaining.\r\n *\r\n * @example\r\n * const users = await db.table('users').whereBetween('age', [20, 30]).get();\r\n * console.log(users); // [{ id: 1, name: 'John', age: 30 }, { id: 2, name: 'Jane', age: 25 }]\r\n */\r\n whereBetween(column: string, values: [any, any]): Table {\r\n const clone = this.clone();\r\n const [value1, value2] = values;\r\n if (value1 !== undefined && value2 !== undefined) {\r\n clone.dml.where.push({\r\n column,\r\n operator: 'BETWEEN',\r\n value: [value1, value2],\r\n type: clone.nextType,\r\n isGroup: false\r\n });\r\n clone.nextType = 'AND';\r\n }\r\n return clone;\r\n }\r\n\r\n /**\r\n * Adds a WHERE IN condition to the query.\r\n *\r\n * @param {string} column - The column to filter by.\r\n * @param {any[]} values - An array of values to match.\r\n * @returns {Table} - Returns the current instance of Table for method chaining.\r\n *\r\n * @example\r\n * const users = await db.table('users').whereIn('id', [1, 2]).get();\r\n * console.log(users); // [{ id: 1, name: 'John' }, { id: 2, name: 'Jane' }]\r\n */\r\n whereIn(column: string, values: any[]): Table {\r\n const clone = this.clone();\r\n if (Array.isArray(values) && values.length > 0) {\r\n clone.dml.where.push({\r\n column,\r\n operator: 'IN',\r\n value: values,\r\n type: clone.nextType,\r\n isGroup: false\r\n });\r\n clone.nextType = 'AND';\r\n }\r\n return clone;\r\n }\r\n\r\n /**\r\n * Adds a WHERE IS NULL condition to the query.\r\n *\r\n * @param {string} column - The column to filter by.\r\n * @returns {Table} - Returns the current instance of Table for method chaining.\r\n *\r\n * @example\r\n * const users = await db.table('users').whereNull('email').get();\r\n * console.log(users); // [{ id: 3, name: 'Alice', email: null }]\r\n */\r\n whereNull(column: string): Table {\r\n const clone = this.clone();\r\n clone.dml.where.push({\r\n column,\r\n operator: 'IS NULL',\r\n type: clone.nextType,\r\n isGroup: false\r\n });\r\n clone.nextType = 'AND';\r\n return clone;\r\n }\r\n\r\n /**\r\n * Adds a WHERE IS NOT NULL condition to the query.\r\n *\r\n * @param {string} column - The column to filter by.\r\n * @returns {Table} - Returns the current instance of Table for method chaining.\r\n *\r\n * @example\r\n * const users = await db.table('users').whereNotNull('email').get();\r\n * console.log(users); // [{ id: 1, name: 'John', email: 'john@example.com' }]\r\n */\r\n whereNotNull(column: string): Table {\r\n const clone = this.clone();\r\n clone.dml.where.push({\r\n column,\r\n operator: 'IS NOT NULL',\r\n type: clone.nextType,\r\n isGroup: false\r\n });\r\n clone.nextType = 'AND';\r\n return clone;\r\n }\r\n\r\n /**\r\n * Adds a JOIN clause to the query.\r\n *\r\n * @param {string} table - The table to join.\r\n * @param {string} column1 - The column from the current table.\r\n * @param {string} operator - The comparison operator (e.g., '=', '>', '<').\r\n * @param {string} column2 - The column from the joined table.\r\n * @returns {Table} - Returns the current instance of Table for method chaining.\r\n *\r\n * @example\r\n * const users = await db.table('users').join('orders', 'users.id', '=', 'orders.user_id').get();\r\n * console.log(users); // [{ id: 1, name: 'John', order_id: 101 }]\r\n */\r\n join(table: string, column1: string, operator: string, column2: string): Table {\r\n const clone = this.clone();\r\n clone.dml.joins.push({\r\n type: 'INNER',\r\n table,\r\n on: {\r\n column1,\r\n operator,\r\n column2\r\n }\r\n });\r\n return clone;\r\n }\r\n\r\n /**\r\n * Adds a LEFT JOIN clause to the query.\r\n *\r\n * @param {string} table - The table to join.\r\n * @param {string} column1 - The column from the current table.\r\n * @param {string} operator - The comparison operator (e.g., '=', '>', '<').\r\n * @param {string} column2 - The column from the joined table.\r\n * @returns {Table} - Returns the current instance of Table for method chaining.\r\n *\r\n * @example\r\n * const users = await db.table('users').leftJoin('orders', 'users.id', '=', 'orders.user_id').get();\r\n * console.log(users); // [{ id: 1, name: 'John', order_id: 101 }, { id: 2, name: 'Jane', order_id: null }]\r\n */\r\n leftJoin(table: string, column1: string, operator: string, column2: string): Table {\r\n const clone = this.clone();\r\n clone.dml.joins.push({\r\n type: 'LEFT',\r\n table,\r\n on: {\r\n column1,\r\n operator,\r\n column2\r\n }\r\n });\r\n return clone;\r\n }\r\n\r\n /**\r\n * Adds a RIGHT JOIN clause to the query.\r\n *\r\n * @param {string} table - The table to join.\r\n * @param {string} column1 - The column from the current table.\r\n * @param {string} operator - The comparison operator (e.g., '=', '>', '<').\r\n * @param {string} column2 - The column from the joined table.\r\n * @returns {Table} - Returns the current instance of Table for method chaining.\r\n *\r\n * @example\r\n * const users = await db.table('users').rightJoin('orders', 'users.id', '=', 'orders.user_id').get();\r\n * console.log(users); // [{ id: 1, name: 'John', order_id: 101 }, { id: null, name: null, order_id: 102 }]\r\n */\r\n rightJoin(table: string, column1: string, operator: string, column2: string): Table {\r\n const clone = this.clone();\r\n clone.dml.joins.push({\r\n type: 'RIGHT',\r\n table,\r\n on: {\r\n column1,\r\n operator,\r\n column2\r\n }\r\n });\r\n return clone;\r\n }\r\n\r\n /**\r\n * Adds an ORDER BY clause to the query.\r\n *\r\n * @param {string} column - The column to order by.\r\n * @param {'ASC' | 'DESC'} direction - The sorting direction ('ASC' or 'DESC').\r\n * @returns {Table} - Returns the current instance of Table for method chaining.\r\n *\r\n * @example\r\n * const users = await db.table('users').orderBy('name', 'ASC').get();\r\n * console.log(users); // [{ id: 2, name: 'Jane' }, { id: 1, name: 'John' }]\r\n */\r\n orderBy(column: string, direction: 'ASC' | 'DESC' = 'ASC'): Table {\r\n const clone = this.clone();\r\n const validDirections: ('ASC' | 'DESC')[] = ['ASC', 'DESC'];\r\n if (validDirections.includes(direction.toUpperCase() as 'ASC' | 'DESC')) {\r\n clone.dml.orderBy.push({\r\n column,\r\n direction: direction.toUpperCase() as 'ASC' | 'DESC'\r\n });\r\n } else {\r\n throw new Error(`Invalid direction: ${direction}. Use 'ASC' or 'DESC'.`);\r\n }\r\n return clone;\r\n }\r\n\r\n /**\r\n * Adds a GROUP BY clause to the query.\r\n *\r\n * @param {string} column - The column to group by.\r\n * @returns {Table} - Returns the current instance of Table for method chaining.\r\n *\r\n * @example\r\n * const users = await db.table('users').groupBy('age').get();\r\n * console.log(users); // [{ age: 30, count: 1 }, { age: 25, count: 1 }]\r\n */\r\n groupBy(column: string): Table {\r\n const clone = this.clone();\r\n clone.dml.groupBy.push(column);\r\n return clone;\r\n }\r\n\r\n /**\r\n * Adds a DISTINCT clause to the query.\r\n *\r\n * @returns {Table} - Returns the current instance of Table for method chaining.\r\n *\r\n * @example\r\n * const users = await db.table('users').distinct().select(['name']).get();\r\n * console.log(users); // [{ name: 'John' }, { name: 'Jane' }]\r\n */\r\n distinct(): Table {\r\n const clone = this.clone();\r\n clone.dml.distinct = true;\r\n return clone;\r\n }\r\n\r\n /**\r\n * Adds a COUNT clause to the query.\r\n *\r\n * @param {string} column - The column to count (default is '*').\r\n * @returns {Table} - Returns the current instance of Table for method chaining.\r\n *\r\n * @example\r\n * const count = await db.table('users').count().first();\r\n * console.log(count); // { count: 2 }\r\n */\r\n async count(column: string = '*'): Promise<Number> {\r\n const executionDML = {\r\n ...this.dml,\r\n type: 'select',\r\n aggregation: {\r\n type: 'COUNT',\r\n column,\r\n alias: 'count'\r\n },\r\n columns: [`COUNT(${column}) AS count`],\r\n data: null,\r\n limit: 1\r\n };\r\n try {\r\n const result = await this.getResponse(executionDML);\r\n const res = result[0] || null;\r\n if(res){\r\n return res.count;\r\n }\r\n return 0;\r\n }\r\n catch (error) {\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Adds a SUM clause to the query.\r\n *\r\n * @param {string} column - The column to sum.\r\n * @returns {Table} - Returns the current instance of Table for method chaining.\r\n *\r\n * @example\r\n * const totalAge = await db.table('users').sum('age').first();\r\n * console.log(totalAge); // { sum: 55 }\r\n */\r\n async sum(column: string): Promise<Number> {\r\n const executionDML = {\r\n ...this.dml,\r\n type: 'select',\r\n aggregation: {\r\n type: 'SUM',\r\n column,\r\n alias: 'sum'\r\n },\r\n columns: [`SUM(${column}) AS sum`],\r\n data: null,\r\n limit: 1\r\n };\r\n try {\r\n const result = await this.getResponse(executionDML);\r\n const res = result[0] || null;\r\n if(res){\r\n return res.sum;\r\n }\r\n return 0;\r\n }\r\n catch (error) {\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Adds an AVG clause to the query.\r\n *\r\n * @param {string} column - The column to calculate the average.\r\n * @returns {Table} - Returns the current instance of Table for method chaining.\r\n *\r\n * @example\r\n * const avgAge = await db.table('users').avg('age').first();\r\n * console.log(avgAge); // { avg: 27.5 }\r\n */\r\n async avg(column: string): Promise<Number> {\r\n const executionDML = {\r\n ...this.dml,\r\n type: 'select',\r\n aggregation: {\r\n type: 'AVG',\r\n column,\r\n alias: 'avg'\r\n },\r\n columns: [`AVG(${column}) AS avg`],\r\n data: null,\r\n limit: 1\r\n };\r\n try {\r\n const result = await this.getResponse(executionDML);\r\n const res = result[0] || null;\r\n if(res){\r\n return res.avg;\r\n }\r\n return 0;\r\n }\r\n catch (error) {\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Adds a MAX clause to the query.\r\n *\r\n * @param {string} column - The column to find the maximum value.\r\n * @returns {Table} - Returns the current instance of Table for method chaining.\r\n *\r\n * @example\r\n * const maxAge = await db.table('users').max('age').first();\r\n * console.log(maxAge); // { max: 30 }\r\n */\r\n async max(column: string): Promise<Number> {\r\n const executionDML = {\r\n ...this.dml,\r\n type: 'select',\r\n aggregation: {\r\n type: 'MAX',\r\n column,\r\n alias: 'max'\r\n },\r\n columns: [`MAX(${column}) AS max`],\r\n data: null,\r\n limit: 1\r\n };\r\n try {\r\n const result = await this.getResponse(executionDML);\r\n const res = result[0] || null;\r\n if(res){\r\n return res.max;\r\n }\r\n return 0;\r\n }\r\n catch (error) {\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Adds a MIN clause to the query.\r\n *\r\n * @param {string} column - The column to find the minimum value.\r\n * @returns {Table} - Returns the current instance of Table for method chaining.\r\n *\r\n * @example\r\n * const minAge = await db.table('users').min('age').first();\r\n * console.log(minAge); // { min: 25 }\r\n */\r\n async min(column: string): Promise<Number> {\r\n const executionDML = {\r\n ...this.dml,\r\n type: 'select',\r\n aggregation: {\r\n type: 'MIN',\r\n column,\r\n alias: 'min'\r\n },\r\n columns: [`MIN(${column}) AS min`],\r\n data: null,\r\n limit: 1\r\n };\r\n try {\r\n const result = await this.getResponse(executionDML);\r\n const res = result[0] || null;\r\n if(res){\r\n return res.min;\r\n }\r\n return 0;\r\n }\r\n catch (error) {\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Adds a LIMIT clause to the query.\r\n *\r\n * @param {number} number - The maximum number of rows to return.\r\n * @returns {Table} - Returns the current instance of Table for method chaining.\r\n *\r\n * @example\r\n * const users = await db.table('users').limit(1).get();\r\n * console.log(users); // [{ id: 1, name: 'John', age: 30 }]\r\n */\r\n limit(number: number): Table {\r\n const clone = this.clone();\r\n clone.dml.limit = number;\r\n return clone;\r\n }\r\n\r\n /**\r\n * Adds pagination to the query using LIMIT and OFFSET.\r\n *\r\n * @param {number} number - The page number (starting from 1).\r\n * @returns {Table} - Returns the current instance of Table for method chaining.\r\n *\r\n * @example\r\n * const users = await db.table('users').limit(1).page(2).get();\r\n * console.log(users); // [{ id: 2, name: 'Jane', age: 25 }]\r\n */\r\n page(number: number): Table {\r\n const clone = this.clone();\r\n if (clone.dml.limit) {\r\n clone.dml.offset = (number - 1) * clone.dml.limit;\r\n }\r\n return clone;\r\n }\r\n\r\n /**\r\n * Executes the query and returns all matching rows.\r\n *\r\n * @returns {Promise<DatabaseRecord[]>} - Returns an array of rows.\r\n *\r\n * @example\r\n * const users = await db.table('users').get();\r\n * console.log(users); // [{ id: 1, name: 'John' }, { id: 2, name: 'Jane' }]\r\n */\r\n async get(): Promise<DatabaseRecord[]> {\r\n try {\r\n const executionDML = {\r\n ...this.dml,\r\n type: 'select',\r\n data: null\r\n };\r\n const result = await this.getResponse(executionDML);\r\n return result;\r\n }\r\n catch (error) {\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Executes the query and returns the first matching row.\r\n *\r\n * @returns {Promise<DatabaseRecord | null>} - Returns the first row or null if no rows match.\r\n *\r\n * @example\r\n * const user = await db.table('users').first();\r\n * console.log(user); // { id: 1, name: 'John' }\r\n */\r\n async first(): Promise<DatabaseRecord | null> {\r\n const executionDML = {\r\n ...this.dml,\r\n type: 'select',\r\n data: null,\r\n limit: 1\r\n };\r\n try {\r\n const result = await this.getResponse(executionDML);\r\n return result[0] || null;\r\n }\r\n catch (error) {\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Finds a row by a specific column value.\r\n *\r\n * @param {any} value - The value to search for.\r\n * @param {string} column - The column to search in (default is 'id').\r\n * @returns {Promise<DatabaseRecord | null>} - Returns the first matching row or null if no rows match.\r\n *\r\n * @example\r\n * const user = await db.table('users').find(1);\r\n * console.log(user); // { id: 1, name: 'John' }\r\n */\r\n async find(value: any, column: string = 'id'): Promise<DatabaseRecord | null> {\r\n const executionDML = {\r\n ...this.dml,\r\n type: 'select',\r\n data: null,\r\n where: [...this.dml.where, {\r\n column,\r\n operator: '=',\r\n value,\r\n type: 'AND',\r\n isGroup: false\r\n }],\r\n limit: 1\r\n };\r\n try {\r\n const result = await this.getResponse(executionDML);\r\n return result[0] || null;\r\n }\r\n catch (error) {\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Inserts one or more rows into the table.\r\n *\r\n * @param {DatabaseRecord[]} data - An array of objects representing the rows to insert.\r\n * @returns {Promise<DatabaseRecord[]>} - Returns an array of the inserted rows.\r\n *\r\n * @example\r\n * const newUsers = await db.table('users').insert([\r\n * { name: 'Alice', age: 28 },\r\n * { name: 'Bob', age: 32 }\r\n * ]);\r\n * console.log(newUsers); // [{ id: 3, name: 'Alice', age: 28 }, { id: 4, name: 'Bob', age: 32 }]\r\n */\r\n async insert(data: DatabaseRecord[]): Promise<DatabaseRecord[]> {\r\n if (!Array.isArray(data)) {\r\n throw new Error('The insert method requires an array of objects with key-value pairs.');\r\n }\r\n\r\n if (!data.every(item => typeof item === 'object' && item !== null)) {\r\n throw new Error('The array must contain only valid objects.');\r\n }\r\n\r\n const executionDML = {\r\n ...this.dml,\r\n type: 'insert',\r\n data: data\r\n };\r\n\r\n const result = await this.getResponse(executionDML, 'Add');\r\n\r\n // Handle different database responses\r\n if (result && result[0]) {\r\n // MongoDB returns inserted_ids array\r\n if (result[0].inserted_ids !== undefined && Array.isArray(result[0].inserted_ids)) {\r\n return data.map((item, index) => ({\r\n ...item,\r\n _id: result[0].inserted_ids[index]\r\n }));\r\n }\r\n\r\n // SQL databases return last_insert_id for single inserts\r\n if (result[0].last_insert_id !== undefined && data.length === 1) {\r\n return [{\r\n ...data[0],\r\n id: result[0].last_insert_id\r\n }];\r\n }\r\n }\r\n\r\n return data;\r\n }\r\n\r\n /**\r\n * Updates rows in the table based on the defined conditions.\r\n *\r\n * @param {DatabaseRecord} data - An object with key-value pairs representing the fields to update.\r\n * @returns {Promise<any>} - Returns the result of the update operation.\r\n *\r\n * @example\r\n * const result = await db.table('users')\r\n * .where('id', '=', 1)\r\n * .update({ name: 'John Updated', age: 31 });\r\n * console.log(result); // { affectedRows: 1 }\r\n */\r\n async update(data: DatabaseRecord): Promise<any> {\r\n if (typeof data !== 'object' || Array.isArray(data)) {\r\n throw new Error('The update method requires an object with key-value pairs.');\r\n }\r\n\r\n if (this.dml.where.length === 0) {\r\n throw new Error('You must specify at least one WHERE condition to perform an update.');\r\n }\r\n\r\n const executionDML = {\r\n ...this.dml,\r\n type: 'update',\r\n data: data\r\n };\r\n\r\n await this.getResponse(executionDML, 'Update');\r\n\r\n return data;\r\n }\r\n\r\n /**\r\n * Deletes rows from the table based on the defined conditions.\r\n *\r\n * @returns {Promise<any>} - Returns the result of the delete operation.\r\n *\r\n * @example\r\n * const result = await db.table('users').where('id', '=', 1).delete();\r\n * console.log(result); // { affectedRows: 1 }\r\n */\r\n async delete(): Promise<any> {\r\n if (this.dml.where.length === 0) {\r\n throw new Error('You must specify at least one WHERE condition to perform a delete.');\r\n }\r\n\r\n const executionDML = {\r\n ...this.dml,\r\n type: 'delete'\r\n };\r\n\r\n const deleteData = await this.getResponse(executionDML, 'Delete');\r\n return deleteData;\r\n }\r\n\r\n private async getResponse(dml: any = null, type: any = null): Promise<any> {\r\n const localDML = dml ? dml : this.dml;\r\n const computedFieldsNeeded: any[] = [];\r\n let dependeciesArrray: any[] = [];\r\n\r\n if (this.computedFields.length > 0) {\r\n let columns = localDML.columns;\r\n\r\n for (const field of localDML.columns) {\r\n const computedField = this.computedFields.find(cf => cf.column === field);\r\n\r\n if (computedField) {\r\n computedFieldsNeeded.push(computedField);\r\n // Add dependencies to real fields\r\n const dependencies = ComputedFieldProcessor.extractDependencies(computedField.instruction);\r\n dependeciesArrray = [...dependeciesArrray, ...dependencies];\r\n columns = Array.from(new Set([...columns, ...dependencies]));\r\n columns = columns.filter((col: string) => col != field);\r\n }\r\n }\r\n localDML.columns = columns;\r\n }\r\n\r\n let arrayResult = [];\r\n if (type) {\r\n const beffore = this.trigger.get('before' + type);\r\n const after = this.trigger.get('after' + type);\r\n if (this.triggers.length > 0 && (beffore || after)) {\r\n const dataset = localDML.data;\r\n for (let index = 0; index < dataset.length; index++) {\r\n const data = dataset[index];\r\n const newDML = { ...localDML, data: [data] };\r\n if (beffore) {\r\n const interceptor = await this.trigger.execute('before' + type, data);\r\n const response = await this.engine.run('query_engine', [\r\n '--action', 'execute',\r\n '--dml', JSON.stringify(newDML)\r\n ]);\r\n\r\n if (response.status != 200) {\r\n interceptor.discard();\r\n returnFormattedError(response.status, response.message);\r\n }\r\n await interceptor.commit();\r\n arrayResult = response.data;\r\n }\r\n if (after) {\r\n\r\n const response = await this.engine.run('query_engine', [\r\n '--action', 'execute',\r\n '--dml', JSON.stringify(newDML)\r\n ]);\r\n\r\n if (response.status != 200) {\r\n returnFormattedError(response.status, response.message);\r\n }\r\n const interceptor = await this.trigger.execute('after' + type, data);\r\n await interceptor.commit();\r\n }\r\n }\r\n } else {\r\n const response = await this.engine.run('query_engine', [\r\n '--action', 'execute',\r\n '--dml', JSON.stringify(localDML)\r\n ]);\r\n\r\n if (response.status != 200) {\r\n returnFormattedError(response.status, response.message);\r\n }\r\n\r\n arrayResult = response.data;\r\n }\r\n } else {\r\n const response = await this.engine.run('query_engine', [\r\n '--action', 'execute',\r\n '--dml', JSON.stringify(localDML)\r\n ]);\r\n\r\n if (response.status != 200) {\r\n returnFormattedError(response.status, response.message);\r\n }\r\n\r\n arrayResult = response.data;\r\n }\r\n\r\n if (computedFieldsNeeded.length > 0) {\r\n let newDataset: any = ComputedFieldProcessor.computedFields(arrayResult, computedFieldsNeeded);\r\n const result = newDataset.map((obj: any) => {\r\n const newObj = { ...obj };\r\n dependeciesArrray.forEach(key => delete newObj[key]);\r\n return newObj;\r\n });\r\n return result;\r\n }\r\n\r\n return arrayResult;\r\n }\r\n\r\n private clone(): Table {\r\n const cloned = Object.create(Object.getPrototypeOf(this));\r\n cloned.engine = this.engine;\r\n cloned.nextType = this.nextType;\r\n cloned.computedFields = this.computedFields;\r\n cloned.trigger = this.trigger;\r\n cloned.triggers = this.triggers;\r\n cloned.dml = {\r\n ...this.dml,\r\n columns: [...this.dml.columns],\r\n joins: [...this.dml.joins],\r\n where: [...this.dml.where],\r\n orderBy: [...this.dml.orderBy],\r\n groupBy: [...this.dml.groupBy]\r\n };\r\n return cloned;\r\n }\r\n\r\n}\r\n\r\nfunction returnFormattedError(status: number, message: string) {\r\n const RESET = '\\x1b[0m';\r\n const RED = '\\x1b[31m';\r\n const YELLOW = '\\x1b[33m';\r\n const BOLD = '\\x1b[1m';\r\n const CYAN = '\\x1b[36m';\r\n const GRAY = '\\x1b[90m';\r\n const UNDERLINE = '\\x1b[4m';\r\n const MAGENTA = '\\x1b[35m';\r\n\r\n let output = '';\r\n let help = '';\r\n const color = status === 600 ? YELLOW : RED;\r\n\r\n\r\n if (message.includes(\"[help]\")) {\r\n const parts = message.split(\"[help]\");\r\n output += `\\n${RED}${BOLD}${parts[0]}${RESET}`;\r\n help += `\\n${MAGENTA}${BOLD}[help]${RESET} ${GRAY}${parts[1]}${RESET}\\n`;\r\n } else {\r\n output += `\\n${color}${BOLD}${message}${RESET}\\n`;\r\n }\r\n\r\n const err = new Error();\r\n const stackLines = err.stack?.split('\\n') || [];\r\n\r\n // Buscamos la primera línea del stack fuera de node_modules\r\n const relevantStackLine = stackLines.find(line =>\r\n line.includes('.js:') && !line.includes('node_modules')\r\n );\r\n\r\n if (relevantStackLine) {\r\n const match = relevantStackLine.match(/\\((.*):(\\d+):(\\d+)\\)/) ||\r\n relevantStackLine.match(/at (.*):(\\d+):(\\d+)/);\r\n\r\n if (match) {\r\n const [, filePath, lineStr, columnStr] = match;\r\n const lineNum = parseInt(lineStr, 10);\r\n const errorLocation = `${filePath}:${lineStr}:${columnStr}`;\r\n\r\n // Leemos el archivo y sacamos las líneas relevantes\r\n try {\r\n const codeLines = fs.readFileSync(filePath, 'utf-8').split('\\n');\r\n const start = Math.max(0, lineNum - 3);\r\n const end = Math.min(codeLines.length, lineNum + 2);\r\n\r\n output += `\\n${CYAN}${BOLD}[code] ${RESET}${YELLOW} ${UNDERLINE}${errorLocation}${RESET}\\n`;\r\n\r\n for (let i = start; i < end; i++) {\r\n const line = codeLines[i];\r\n const lineLabel = `${i + 1}`.padStart(4, ' ');\r\n const pointer = i + 1 === lineNum ? `${RED}<-${RESET}` : ' ';\r\n output += `${GRAY}${lineLabel}${RESET} ${pointer} ${line}\\n`;\r\n }\r\n } catch (err) {\r\n output += `${YELLOW}⚠️ No se pudo leer el archivo de origen: ${filePath}${RESET}\\n`;\r\n output += `\\n${CYAN}${BOLD}Stack Trace:${RESET}\\n${stackLines.slice(2).join('\\n')}\\n`;\r\n }\r\n }\r\n }\r\n output += help;\r\n console.error(output);\r\n}\r\n\r\nexport default Database;\r\n","import path from \"path\";\r\nimport { FileLogger } from \"@dbcube/core\";\r\nimport { createRequire } from 'module';\r\n\r\nexport class Trigger{\r\n private triggers: any[];\r\n private databaseName: string;\r\n private instance: any;\r\n\r\n constructor(instance:any, databaseName:string, metadata: any[]){\r\n this.triggers = metadata;\r\n this.databaseName = databaseName;\r\n this.instance = instance;\r\n }\r\n\r\n get(type:string){\r\n return this.triggers.find((tr:any)=> tr.type === type);\r\n }\r\n\r\n async execute(type: string, row:any){\r\n const trigger = this.triggers.find((tr:any)=> tr.type === type);\r\n if (trigger) {\r\n const logFilePath = path.resolve(\r\n process.cwd(),\r\n 'dbcube',\r\n 'logs',\r\n 'triggers',\r\n this.databaseName,\r\n `${trigger.table_ref}_${trigger.type}.log`\r\n );\r\n \r\n const interceptor = FileLogger.interceptConsole(logFilePath, {\r\n keepOriginal: false,\r\n useBuffer: true\r\n });\r\n const pathFile = path.resolve(process.cwd(), 'dbcube', 'triggers', `${trigger.database_ref}_${trigger.table_ref}_${trigger.type}.js`);\r\n // Use __filename for CJS, process.cwd() for ESM\r\n const requireUrl = typeof __filename !== 'undefined' ? __filename : process.cwd();\r\n const require = createRequire(requireUrl);\r\n // Clear require cache to ensure fresh load\r\n delete require.cache[require.resolve(pathFile)];\r\n const triggerModule = require(pathFile);\r\n const dataProcess = triggerModule.default || triggerModule;\r\n await dataProcess({db: this.instance, oldData: row, newData: row});\r\n interceptor.restore(); \r\n return interceptor;\r\n }\r\n return null;\r\n }\r\n}","import { Table, Database } from './lib/Database';\r\nimport type { DatabaseRecord, WhereCallback } from './@types/Database';\r\n\r\nexport default Database;\r\nexport { \r\n Table, \r\n Database,\r\n type DatabaseRecord,\r\n type WhereCallback\r\n};"],"mappings":"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","names":["require","err"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dbcube/query-builder",
3
- "version": "3.0.28",
3
+ "version": "3.0.30",
4
4
  "description": "The DBCube Query Builder is a lightweight, flexible, and fluent library for building queries across multiple database engines, including MySQL, PostgreSQL, SQLite, and MongoDB, using JavaScript/Node.js. \nIts agnostic design allows you to generate data manipulation (DML) and data definition (DDL) operations with a clean, chainable syntax—without sacrificing power or expressiveness.\nIt’s designed to work seamlessly in both SQL and NoSQL environments, providing a consistent abstraction layer across different storage technologies while still leveraging the native capabilities of each engine.",
5
5
  "main": "dist/index.cjs",
6
6
  "module": "dist/index.js",
@@ -54,7 +54,7 @@
54
54
  "access": "public"
55
55
  },
56
56
  "dependencies": {
57
- "@dbcube/core": "^3.0.30"
57
+ "@dbcube/core": "^3.0.32"
58
58
  },
59
59
  "repository": {
60
60
  "type": "git",