@dbcube/query-builder 3.0.34 → 3.0.36

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
@@ -255,7 +255,7 @@ var Table = class _Table {
255
255
  */
256
256
  whereGroup(callback) {
257
257
  const clone = this.clone();
258
- const groupQuery = new _Table(clone.dml.database, clone.dml.table, clone.engine);
258
+ const groupQuery = new _Table(this, clone.dml.database, clone.dml.table, clone.engine);
259
259
  callback(groupQuery);
260
260
  clone.dml.where.push({
261
261
  type: clone.nextType,
@@ -510,20 +510,18 @@ var Table = class _Table {
510
510
  * console.log(count); // { count: 2 }
511
511
  */
512
512
  async count(column = "*") {
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
513
+ const clone = this.clone();
514
+ clone.dml.type = "select";
515
+ clone.dml.aggregation = {
516
+ type: "COUNT",
517
+ column,
518
+ alias: "count"
524
519
  };
520
+ clone.dml.columns = [`COUNT(${column}) AS count`];
521
+ clone.dml.data = null;
522
+ clone.dml.limit = 1;
525
523
  try {
526
- const result = await this.getResponse(executionDML);
524
+ const result = await clone.getResponse();
527
525
  const res = result[0] || null;
528
526
  if (res) {
529
527
  return res.count;
@@ -544,20 +542,18 @@ var Table = class _Table {
544
542
  * console.log(totalAge); // { sum: 55 }
545
543
  */
546
544
  async sum(column) {
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
545
+ const clone = this.clone();
546
+ clone.dml.type = "select";
547
+ clone.dml.aggregation = {
548
+ type: "SUM",
549
+ column,
550
+ alias: "sum"
558
551
  };
552
+ clone.dml.columns = [`SUM(${column}) AS sum`];
553
+ clone.dml.data = null;
554
+ clone.dml.limit = 1;
559
555
  try {
560
- const result = await this.getResponse(executionDML);
556
+ const result = await clone.getResponse();
561
557
  const res = result[0] || null;
562
558
  if (res) {
563
559
  return res.sum;
@@ -578,20 +574,18 @@ var Table = class _Table {
578
574
  * console.log(avgAge); // { avg: 27.5 }
579
575
  */
580
576
  async avg(column) {
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
577
+ const clone = this.clone();
578
+ clone.dml.type = "select";
579
+ clone.dml.aggregation = {
580
+ type: "AVG",
581
+ column,
582
+ alias: "avg"
592
583
  };
584
+ clone.dml.columns = [`AVG(${column}) AS avg`];
585
+ clone.dml.data = null;
586
+ clone.dml.limit = 1;
593
587
  try {
594
- const result = await this.getResponse(executionDML);
588
+ const result = await clone.getResponse();
595
589
  const res = result[0] || null;
596
590
  if (res) {
597
591
  return res.avg;
@@ -612,20 +606,18 @@ var Table = class _Table {
612
606
  * console.log(maxAge); // { max: 30 }
613
607
  */
614
608
  async max(column) {
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
609
+ const clone = this.clone();
610
+ clone.dml.type = "select";
611
+ clone.dml.aggregation = {
612
+ type: "MAX",
613
+ column,
614
+ alias: "max"
626
615
  };
616
+ clone.dml.columns = [`MAX(${column}) AS max`];
617
+ clone.dml.data = null;
618
+ clone.dml.limit = 1;
627
619
  try {
628
- const result = await this.getResponse(executionDML);
620
+ const result = await clone.getResponse();
629
621
  const res = result[0] || null;
630
622
  if (res) {
631
623
  return res.max;
@@ -646,20 +638,18 @@ var Table = class _Table {
646
638
  * console.log(minAge); // { min: 25 }
647
639
  */
648
640
  async min(column) {
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
641
+ const clone = this.clone();
642
+ clone.dml.type = "select";
643
+ clone.dml.aggregation = {
644
+ type: "MIN",
645
+ column,
646
+ alias: "min"
660
647
  };
648
+ clone.dml.columns = [`MIN(${column}) AS min`];
649
+ clone.dml.data = null;
650
+ clone.dml.limit = 1;
661
651
  try {
662
- const result = await this.getResponse(executionDML);
652
+ const result = await clone.getResponse();
663
653
  const res = result[0] || null;
664
654
  if (res) {
665
655
  return res.min;
@@ -712,12 +702,10 @@ var Table = class _Table {
712
702
  */
713
703
  async get() {
714
704
  try {
715
- const executionDML = {
716
- ...this.dml,
717
- type: "select",
718
- data: null
719
- };
720
- const result = await this.getResponse(executionDML);
705
+ const clone = this.clone();
706
+ clone.dml.type = "select";
707
+ clone.dml.data = null;
708
+ const result = await clone.getResponse();
721
709
  return result;
722
710
  } catch (error) {
723
711
  throw error;
@@ -733,14 +721,12 @@ var Table = class _Table {
733
721
  * console.log(user); // { id: 1, name: 'John' }
734
722
  */
735
723
  async first() {
736
- const executionDML = {
737
- ...this.dml,
738
- type: "select",
739
- data: null,
740
- limit: 1
741
- };
724
+ const clone = this.clone();
725
+ clone.dml.type = "select";
726
+ clone.dml.data = null;
727
+ clone.dml.limit = 1;
742
728
  try {
743
- const result = await this.getResponse(executionDML);
729
+ const result = await clone.getResponse();
744
730
  return result[0] || null;
745
731
  } catch (error) {
746
732
  throw error;
@@ -758,21 +744,13 @@ var Table = class _Table {
758
744
  * console.log(user); // { id: 1, name: 'John' }
759
745
  */
760
746
  async find(value, column = "id") {
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
- };
747
+ const clone = this.clone();
748
+ clone.dml.type = "select";
749
+ clone.dml.data = null;
750
+ clone.where(column, "=", value);
751
+ clone.dml.limit = 1;
774
752
  try {
775
- const result = await this.getResponse(executionDML);
753
+ const result = await clone.getResponse();
776
754
  return result[0] || null;
777
755
  } catch (error) {
778
756
  throw error;
@@ -792,55 +770,16 @@ var Table = class _Table {
792
770
  * console.log(newUsers); // [{ id: 3, name: 'Alice', age: 28 }, { id: 4, name: 'Bob', age: 32 }]
793
771
  */
794
772
  async insert(data) {
773
+ const clone = this.clone();
795
774
  if (!Array.isArray(data)) {
796
775
  throw new Error("The insert method requires an array of objects with key-value pairs.");
797
776
  }
798
777
  if (!data.every((item) => typeof item === "object" && item !== null)) {
799
778
  throw new Error("The array must contain only valid objects.");
800
779
  }
801
- const executionDML = {
802
- ...this.dml,
803
- type: "insert",
804
- data
805
- };
806
- const result = await this.getResponse(executionDML, "Add");
807
- console.log("\u{1F50D} INSERT result from engine:", JSON.stringify(result, null, 2));
808
- let insertedUuids = [];
809
- if (result && result[0] && result[0].inserted_uuids && Array.isArray(result[0].inserted_uuids)) {
810
- insertedUuids = result[0].inserted_uuids;
811
- }
812
- console.log("\u{1F50D} Extracted UUIDs:", insertedUuids);
813
- if (insertedUuids.length > 0) {
814
- const selectDML = {
815
- ...this.dml,
816
- type: "select",
817
- columns: ["*"],
818
- where: [
819
- {
820
- column: "uuid",
821
- operator: "IN",
822
- value: insertedUuids,
823
- type: "AND",
824
- isGroup: false
825
- }
826
- ],
827
- data: null,
828
- aggregation: null,
829
- limit: null,
830
- offset: null
831
- };
832
- try {
833
- const insertedRecords = await this.getResponse(selectDML);
834
- console.log("\u{1F50D} Selected records:", JSON.stringify(insertedRecords, null, 2));
835
- return insertedRecords;
836
- } catch (error) {
837
- console.warn("Failed to fetch inserted records, returning data with UUIDs");
838
- return data.map((item, index) => ({
839
- ...item,
840
- uuid: insertedUuids[index]
841
- }));
842
- }
843
- }
780
+ clone.dml.type = "insert";
781
+ clone.dml.data = data;
782
+ await clone.getResponse(clone.dml, "Add");
844
783
  return data;
845
784
  }
846
785
  /**
@@ -856,18 +795,16 @@ var Table = class _Table {
856
795
  * console.log(result); // { affectedRows: 1 }
857
796
  */
858
797
  async update(data) {
798
+ const clone = this.clone();
859
799
  if (typeof data !== "object" || Array.isArray(data)) {
860
800
  throw new Error("The update method requires an object with key-value pairs.");
861
801
  }
862
- if (this.dml.where.length === 0) {
802
+ if (clone.dml.where.length === 0) {
863
803
  throw new Error("You must specify at least one WHERE condition to perform an update.");
864
804
  }
865
- const executionDML = {
866
- ...this.dml,
867
- type: "update",
868
- data
869
- };
870
- await this.getResponse(executionDML, "Update");
805
+ clone.dml.type = "update";
806
+ clone.dml.data = data;
807
+ await clone.getResponse(clone.dml, "Update");
871
808
  return data;
872
809
  }
873
810
  /**
@@ -880,14 +817,12 @@ var Table = class _Table {
880
817
  * console.log(result); // { affectedRows: 1 }
881
818
  */
882
819
  async delete() {
883
- if (this.dml.where.length === 0) {
820
+ const clone = this.clone();
821
+ if (clone.dml.where.length === 0) {
884
822
  throw new Error("You must specify at least one WHERE condition to perform a delete.");
885
823
  }
886
- const executionDML = {
887
- ...this.dml,
888
- type: "delete"
889
- };
890
- const deleteData = await this.getResponse(executionDML, "Delete");
824
+ clone.dml.type = "delete";
825
+ const deleteData = await clone.getResponse(clone.dml, "Delete");
891
826
  return deleteData;
892
827
  }
893
828
  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 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 console.log('🔍 INSERT result from engine:', JSON.stringify(result, null, 2));\r\n\r\n // Extract inserted UUIDs from the response\r\n let insertedUuids: string[] = [];\r\n if (result && result[0] && result[0].inserted_uuids && Array.isArray(result[0].inserted_uuids)) {\r\n insertedUuids = result[0].inserted_uuids;\r\n }\r\n\r\n console.log('🔍 Extracted UUIDs:', insertedUuids);\r\n\r\n // If we have UUIDs, fetch the complete inserted records\r\n if (insertedUuids.length > 0) {\r\n // Create a new query to select the inserted records by UUID\r\n const selectDML = {\r\n ...this.dml,\r\n type: 'select',\r\n columns: ['*'],\r\n where: [\r\n {\r\n column: 'uuid',\r\n operator: 'IN',\r\n value: insertedUuids,\r\n type: 'AND',\r\n isGroup: false\r\n }\r\n ],\r\n data: null,\r\n aggregation: null,\r\n limit: null,\r\n offset: null\r\n };\r\n\r\n try {\r\n const insertedRecords = await this.getResponse(selectDML);\r\n console.log('🔍 Selected records:', JSON.stringify(insertedRecords, null, 2));\r\n return insertedRecords;\r\n } catch (error) {\r\n // If SELECT fails, return data with UUIDs appended\r\n console.warn('Failed to fetch inserted records, returning data with UUIDs');\r\n return data.map((item, index) => ({\r\n ...item,\r\n uuid: insertedUuids[index]\r\n }));\r\n }\r\n }\r\n\r\n // Fallback: return original data\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"]}
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(this, 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 clone = this.clone();\r\n clone.dml.type = 'select';\r\n clone.dml.aggregation = {\r\n type: 'COUNT',\r\n column,\r\n alias: 'count'\r\n }\r\n clone.dml.columns = [`COUNT(${column}) AS count`];\r\n clone.dml.data = null;\r\n clone.dml.limit = 1;\r\n try {\r\n const result = await clone.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 const clone = this.clone();\r\n clone.dml.type = 'select';\r\n clone.dml.aggregation = {\r\n type: 'SUM',\r\n column,\r\n alias: 'sum'\r\n }\r\n clone.dml.columns = [`SUM(${column}) AS sum`];\r\n clone.dml.data = null;\r\n clone.dml.limit = 1;\r\n try {\r\n const result = await clone.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 const clone = this.clone();\r\n clone.dml.type = 'select';\r\n clone.dml.aggregation = {\r\n type: 'AVG',\r\n column,\r\n alias: 'avg'\r\n }\r\n clone.dml.columns = [`AVG(${column}) AS avg`];\r\n clone.dml.data = null;\r\n clone.dml.limit = 1;\r\n try {\r\n const result = await clone.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 const clone = this.clone();\r\n clone.dml.type = 'select';\r\n clone.dml.aggregation = {\r\n type: 'MAX',\r\n column,\r\n alias: 'max'\r\n }\r\n clone.dml.columns = [`MAX(${column}) AS max`];\r\n clone.dml.data = null;\r\n clone.dml.limit = 1;\r\n try {\r\n const result = await clone.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 const clone = this.clone();\r\n clone.dml.type = 'select';\r\n clone.dml.aggregation = {\r\n type: 'MIN',\r\n column,\r\n alias: 'min'\r\n }\r\n clone.dml.columns = [`MIN(${column}) AS min`];\r\n clone.dml.data = null;\r\n clone.dml.limit = 1;\r\n try {\r\n const result = await clone.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 const clone = this.clone();\r\n clone.dml.type = 'select';\r\n clone.dml.data = null;\r\n const result = await clone.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 const clone = this.clone();\r\n clone.dml.type = 'select';\r\n clone.dml.data = null;\r\n clone.dml.limit = 1;\r\n try {\r\n const result = await clone.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 const clone = this.clone();\r\n clone.dml.type = 'select';\r\n clone.dml.data = null;\r\n clone.where(column, '=', value);\r\n clone.dml.limit = 1;\r\n try {\r\n const result = await clone.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 const clone = this.clone();\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 clone.dml.type = 'insert';\r\n clone.dml.data = data;\r\n\r\n await clone.getResponse(clone.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 const clone = this.clone();\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 (clone.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 clone.dml.type = 'update';\r\n clone.dml.data = data;\r\n\r\n await clone.getResponse(clone.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 const clone = this.clone();\r\n if (clone.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 clone.dml.type = 'delete';\r\n\r\n const deleteData = await clone.getResponse(clone.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 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
@@ -217,7 +217,7 @@ var Table = class _Table {
217
217
  */
218
218
  whereGroup(callback) {
219
219
  const clone = this.clone();
220
- const groupQuery = new _Table(clone.dml.database, clone.dml.table, clone.engine);
220
+ const groupQuery = new _Table(this, clone.dml.database, clone.dml.table, clone.engine);
221
221
  callback(groupQuery);
222
222
  clone.dml.where.push({
223
223
  type: clone.nextType,
@@ -472,20 +472,18 @@ var Table = class _Table {
472
472
  * console.log(count); // { count: 2 }
473
473
  */
474
474
  async count(column = "*") {
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
475
+ const clone = this.clone();
476
+ clone.dml.type = "select";
477
+ clone.dml.aggregation = {
478
+ type: "COUNT",
479
+ column,
480
+ alias: "count"
486
481
  };
482
+ clone.dml.columns = [`COUNT(${column}) AS count`];
483
+ clone.dml.data = null;
484
+ clone.dml.limit = 1;
487
485
  try {
488
- const result = await this.getResponse(executionDML);
486
+ const result = await clone.getResponse();
489
487
  const res = result[0] || null;
490
488
  if (res) {
491
489
  return res.count;
@@ -506,20 +504,18 @@ var Table = class _Table {
506
504
  * console.log(totalAge); // { sum: 55 }
507
505
  */
508
506
  async sum(column) {
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
507
+ const clone = this.clone();
508
+ clone.dml.type = "select";
509
+ clone.dml.aggregation = {
510
+ type: "SUM",
511
+ column,
512
+ alias: "sum"
520
513
  };
514
+ clone.dml.columns = [`SUM(${column}) AS sum`];
515
+ clone.dml.data = null;
516
+ clone.dml.limit = 1;
521
517
  try {
522
- const result = await this.getResponse(executionDML);
518
+ const result = await clone.getResponse();
523
519
  const res = result[0] || null;
524
520
  if (res) {
525
521
  return res.sum;
@@ -540,20 +536,18 @@ var Table = class _Table {
540
536
  * console.log(avgAge); // { avg: 27.5 }
541
537
  */
542
538
  async avg(column) {
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
539
+ const clone = this.clone();
540
+ clone.dml.type = "select";
541
+ clone.dml.aggregation = {
542
+ type: "AVG",
543
+ column,
544
+ alias: "avg"
554
545
  };
546
+ clone.dml.columns = [`AVG(${column}) AS avg`];
547
+ clone.dml.data = null;
548
+ clone.dml.limit = 1;
555
549
  try {
556
- const result = await this.getResponse(executionDML);
550
+ const result = await clone.getResponse();
557
551
  const res = result[0] || null;
558
552
  if (res) {
559
553
  return res.avg;
@@ -574,20 +568,18 @@ var Table = class _Table {
574
568
  * console.log(maxAge); // { max: 30 }
575
569
  */
576
570
  async max(column) {
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
571
+ const clone = this.clone();
572
+ clone.dml.type = "select";
573
+ clone.dml.aggregation = {
574
+ type: "MAX",
575
+ column,
576
+ alias: "max"
588
577
  };
578
+ clone.dml.columns = [`MAX(${column}) AS max`];
579
+ clone.dml.data = null;
580
+ clone.dml.limit = 1;
589
581
  try {
590
- const result = await this.getResponse(executionDML);
582
+ const result = await clone.getResponse();
591
583
  const res = result[0] || null;
592
584
  if (res) {
593
585
  return res.max;
@@ -608,20 +600,18 @@ var Table = class _Table {
608
600
  * console.log(minAge); // { min: 25 }
609
601
  */
610
602
  async min(column) {
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
603
+ const clone = this.clone();
604
+ clone.dml.type = "select";
605
+ clone.dml.aggregation = {
606
+ type: "MIN",
607
+ column,
608
+ alias: "min"
622
609
  };
610
+ clone.dml.columns = [`MIN(${column}) AS min`];
611
+ clone.dml.data = null;
612
+ clone.dml.limit = 1;
623
613
  try {
624
- const result = await this.getResponse(executionDML);
614
+ const result = await clone.getResponse();
625
615
  const res = result[0] || null;
626
616
  if (res) {
627
617
  return res.min;
@@ -674,12 +664,10 @@ var Table = class _Table {
674
664
  */
675
665
  async get() {
676
666
  try {
677
- const executionDML = {
678
- ...this.dml,
679
- type: "select",
680
- data: null
681
- };
682
- const result = await this.getResponse(executionDML);
667
+ const clone = this.clone();
668
+ clone.dml.type = "select";
669
+ clone.dml.data = null;
670
+ const result = await clone.getResponse();
683
671
  return result;
684
672
  } catch (error) {
685
673
  throw error;
@@ -695,14 +683,12 @@ var Table = class _Table {
695
683
  * console.log(user); // { id: 1, name: 'John' }
696
684
  */
697
685
  async first() {
698
- const executionDML = {
699
- ...this.dml,
700
- type: "select",
701
- data: null,
702
- limit: 1
703
- };
686
+ const clone = this.clone();
687
+ clone.dml.type = "select";
688
+ clone.dml.data = null;
689
+ clone.dml.limit = 1;
704
690
  try {
705
- const result = await this.getResponse(executionDML);
691
+ const result = await clone.getResponse();
706
692
  return result[0] || null;
707
693
  } catch (error) {
708
694
  throw error;
@@ -720,21 +706,13 @@ var Table = class _Table {
720
706
  * console.log(user); // { id: 1, name: 'John' }
721
707
  */
722
708
  async find(value, column = "id") {
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
- };
709
+ const clone = this.clone();
710
+ clone.dml.type = "select";
711
+ clone.dml.data = null;
712
+ clone.where(column, "=", value);
713
+ clone.dml.limit = 1;
736
714
  try {
737
- const result = await this.getResponse(executionDML);
715
+ const result = await clone.getResponse();
738
716
  return result[0] || null;
739
717
  } catch (error) {
740
718
  throw error;
@@ -754,55 +732,16 @@ var Table = class _Table {
754
732
  * console.log(newUsers); // [{ id: 3, name: 'Alice', age: 28 }, { id: 4, name: 'Bob', age: 32 }]
755
733
  */
756
734
  async insert(data) {
735
+ const clone = this.clone();
757
736
  if (!Array.isArray(data)) {
758
737
  throw new Error("The insert method requires an array of objects with key-value pairs.");
759
738
  }
760
739
  if (!data.every((item) => typeof item === "object" && item !== null)) {
761
740
  throw new Error("The array must contain only valid objects.");
762
741
  }
763
- const executionDML = {
764
- ...this.dml,
765
- type: "insert",
766
- data
767
- };
768
- const result = await this.getResponse(executionDML, "Add");
769
- console.log("\u{1F50D} INSERT result from engine:", JSON.stringify(result, null, 2));
770
- let insertedUuids = [];
771
- if (result && result[0] && result[0].inserted_uuids && Array.isArray(result[0].inserted_uuids)) {
772
- insertedUuids = result[0].inserted_uuids;
773
- }
774
- console.log("\u{1F50D} Extracted UUIDs:", insertedUuids);
775
- if (insertedUuids.length > 0) {
776
- const selectDML = {
777
- ...this.dml,
778
- type: "select",
779
- columns: ["*"],
780
- where: [
781
- {
782
- column: "uuid",
783
- operator: "IN",
784
- value: insertedUuids,
785
- type: "AND",
786
- isGroup: false
787
- }
788
- ],
789
- data: null,
790
- aggregation: null,
791
- limit: null,
792
- offset: null
793
- };
794
- try {
795
- const insertedRecords = await this.getResponse(selectDML);
796
- console.log("\u{1F50D} Selected records:", JSON.stringify(insertedRecords, null, 2));
797
- return insertedRecords;
798
- } catch (error) {
799
- console.warn("Failed to fetch inserted records, returning data with UUIDs");
800
- return data.map((item, index) => ({
801
- ...item,
802
- uuid: insertedUuids[index]
803
- }));
804
- }
805
- }
742
+ clone.dml.type = "insert";
743
+ clone.dml.data = data;
744
+ await clone.getResponse(clone.dml, "Add");
806
745
  return data;
807
746
  }
808
747
  /**
@@ -818,18 +757,16 @@ var Table = class _Table {
818
757
  * console.log(result); // { affectedRows: 1 }
819
758
  */
820
759
  async update(data) {
760
+ const clone = this.clone();
821
761
  if (typeof data !== "object" || Array.isArray(data)) {
822
762
  throw new Error("The update method requires an object with key-value pairs.");
823
763
  }
824
- if (this.dml.where.length === 0) {
764
+ if (clone.dml.where.length === 0) {
825
765
  throw new Error("You must specify at least one WHERE condition to perform an update.");
826
766
  }
827
- const executionDML = {
828
- ...this.dml,
829
- type: "update",
830
- data
831
- };
832
- await this.getResponse(executionDML, "Update");
767
+ clone.dml.type = "update";
768
+ clone.dml.data = data;
769
+ await clone.getResponse(clone.dml, "Update");
833
770
  return data;
834
771
  }
835
772
  /**
@@ -842,14 +779,12 @@ var Table = class _Table {
842
779
  * console.log(result); // { affectedRows: 1 }
843
780
  */
844
781
  async delete() {
845
- if (this.dml.where.length === 0) {
782
+ const clone = this.clone();
783
+ if (clone.dml.where.length === 0) {
846
784
  throw new Error("You must specify at least one WHERE condition to perform a delete.");
847
785
  }
848
- const executionDML = {
849
- ...this.dml,
850
- type: "delete"
851
- };
852
- const deleteData = await this.getResponse(executionDML, "Delete");
786
+ clone.dml.type = "delete";
787
+ const deleteData = await clone.getResponse(clone.dml, "Delete");
853
788
  return deleteData;
854
789
  }
855
790
  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 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 console.log('🔍 INSERT result from engine:', JSON.stringify(result, null, 2));\r\n\r\n // Extract inserted UUIDs from the response\r\n let insertedUuids: string[] = [];\r\n if (result && result[0] && result[0].inserted_uuids && Array.isArray(result[0].inserted_uuids)) {\r\n insertedUuids = result[0].inserted_uuids;\r\n }\r\n\r\n console.log('🔍 Extracted UUIDs:', insertedUuids);\r\n\r\n // If we have UUIDs, fetch the complete inserted records\r\n if (insertedUuids.length > 0) {\r\n // Create a new query to select the inserted records by UUID\r\n const selectDML = {\r\n ...this.dml,\r\n type: 'select',\r\n columns: ['*'],\r\n where: [\r\n {\r\n column: 'uuid',\r\n operator: 'IN',\r\n value: insertedUuids,\r\n type: 'AND',\r\n isGroup: false\r\n }\r\n ],\r\n data: null,\r\n aggregation: null,\r\n limit: null,\r\n offset: null\r\n };\r\n\r\n try {\r\n const insertedRecords = await this.getResponse(selectDML);\r\n console.log('🔍 Selected records:', JSON.stringify(insertedRecords, null, 2));\r\n return insertedRecords;\r\n } catch (error) {\r\n // If SELECT fails, return data with UUIDs appended\r\n console.warn('Failed to fetch inserted records, returning data with UUIDs');\r\n return data.map((item, index) => ({\r\n ...item,\r\n uuid: insertedUuids[index]\r\n }));\r\n }\r\n }\r\n\r\n // Fallback: return original data\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"]}
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(this, 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 clone = this.clone();\r\n clone.dml.type = 'select';\r\n clone.dml.aggregation = {\r\n type: 'COUNT',\r\n column,\r\n alias: 'count'\r\n }\r\n clone.dml.columns = [`COUNT(${column}) AS count`];\r\n clone.dml.data = null;\r\n clone.dml.limit = 1;\r\n try {\r\n const result = await clone.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 const clone = this.clone();\r\n clone.dml.type = 'select';\r\n clone.dml.aggregation = {\r\n type: 'SUM',\r\n column,\r\n alias: 'sum'\r\n }\r\n clone.dml.columns = [`SUM(${column}) AS sum`];\r\n clone.dml.data = null;\r\n clone.dml.limit = 1;\r\n try {\r\n const result = await clone.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 const clone = this.clone();\r\n clone.dml.type = 'select';\r\n clone.dml.aggregation = {\r\n type: 'AVG',\r\n column,\r\n alias: 'avg'\r\n }\r\n clone.dml.columns = [`AVG(${column}) AS avg`];\r\n clone.dml.data = null;\r\n clone.dml.limit = 1;\r\n try {\r\n const result = await clone.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 const clone = this.clone();\r\n clone.dml.type = 'select';\r\n clone.dml.aggregation = {\r\n type: 'MAX',\r\n column,\r\n alias: 'max'\r\n }\r\n clone.dml.columns = [`MAX(${column}) AS max`];\r\n clone.dml.data = null;\r\n clone.dml.limit = 1;\r\n try {\r\n const result = await clone.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 const clone = this.clone();\r\n clone.dml.type = 'select';\r\n clone.dml.aggregation = {\r\n type: 'MIN',\r\n column,\r\n alias: 'min'\r\n }\r\n clone.dml.columns = [`MIN(${column}) AS min`];\r\n clone.dml.data = null;\r\n clone.dml.limit = 1;\r\n try {\r\n const result = await clone.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 const clone = this.clone();\r\n clone.dml.type = 'select';\r\n clone.dml.data = null;\r\n const result = await clone.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 const clone = this.clone();\r\n clone.dml.type = 'select';\r\n clone.dml.data = null;\r\n clone.dml.limit = 1;\r\n try {\r\n const result = await clone.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 const clone = this.clone();\r\n clone.dml.type = 'select';\r\n clone.dml.data = null;\r\n clone.where(column, '=', value);\r\n clone.dml.limit = 1;\r\n try {\r\n const result = await clone.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 const clone = this.clone();\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 clone.dml.type = 'insert';\r\n clone.dml.data = data;\r\n\r\n await clone.getResponse(clone.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 const clone = this.clone();\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 (clone.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 clone.dml.type = 'update';\r\n clone.dml.data = data;\r\n\r\n await clone.getResponse(clone.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 const clone = this.clone();\r\n if (clone.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 clone.dml.type = 'delete';\r\n\r\n const deleteData = await clone.getResponse(clone.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 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.34",
3
+ "version": "3.0.36",
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,14 +54,14 @@
54
54
  "access": "public"
55
55
  },
56
56
  "dependencies": {
57
- "@dbcube/core": "^3.0.36"
57
+ "@dbcube/core": "^3.0.38"
58
58
  },
59
59
  "repository": {
60
60
  "type": "git",
61
61
  "url": "https://github.com/Dbcube/query-builder"
62
62
  },
63
63
  "devDependencies": {
64
- "@types/node": "^24.8.1",
64
+ "@types/node": "^24.9.1",
65
65
  "rollup": "^4.52.5",
66
66
  "tsup": "^8.5.0",
67
67
  "typescript": "^5.9.3"