UNPKG

scyllinx

Version:

A modern TypeScript ORM for ScyllaDB and SQL databases with Laravel-inspired syntax

2 lines (1 loc) 6.73 kB
"use strict";var e=require("./index.min.js");require("node-cache"),require("redis"),require("util"),require("@faker-js/faker"),require("reflect-metadata");class t extends e.QueryGrammar{compileSelect(e){const t=[];if(e.ctes?.length&&t.push(`WITH ${this.compileCtes(e.ctes)}`),t.push(e.columns?.length?`SELECT ${e.columns.join(", ")}`:"SELECT *"),e.from&&t.push(`FROM ${this.wrapTable(e.from)}`),e.joins?.length&&t.push(this.compileJoins(e.joins)),e.wheres?.length&&t.push(`WHERE ${this.compileWheres(e.wheres)}`),e.groups?.length&&t.push(`GROUP BY ${e.groups.map(e=>this.wrapColumn(e)).join(", ")}`),e.havings?.length&&t.push(`HAVING ${this.compileWheres(e.havings)}`),e.orders?.length){const n=e.orders.map(e=>`${this.wrapColumn(e.column)} ${e.direction.toUpperCase()}`).join(", ");t.push(`ORDER BY ${n}`)}return null!=e.limit&&t.push(null!=e.offset?`LIMIT ${e.offset}, ${e.limit}`:`LIMIT ${e.limit}`),t.join(" ")}compileInsert(e){const t=this.wrapTable(e.table),n=Object.keys(e.values).map(e=>this.wrapColumn(e)),r=Object.values(e.values).map(()=>"?");let s=`INSERT INTO ${t} (${n.join(", ")}) VALUES (${r.join(", ")})`;if(e.onDuplicateKey){s+=` ON DUPLICATE KEY UPDATE ${Object.keys(e.onDuplicateKey).map(e=>`${this.wrapColumn(e)} = VALUES(${this.wrapColumn(e)})`).join(", ")}`}return s}compileUpdate(e){let t=`UPDATE ${this.wrapTable(e.table)} SET ${Object.keys(e.values).map(e=>`${this.wrapColumn(e)} = ?`).join(", ")}`;if(e.wheres?.length&&(t+=` WHERE ${this.compileWheres(e.wheres)}`),e.orders?.length){t+=` ORDER BY ${e.orders.map(e=>`${this.wrapColumn(e.column)} ${e.direction.toUpperCase()}`).join(", ")}`}return null!=e.limit&&(t+=` LIMIT ${e.limit}`),t}compileDelete(e){let t=`DELETE FROM ${this.wrapTable(e.table)}`;if(e.wheres?.length&&(t+=` WHERE ${this.compileWheres(e.wheres)}`),e.orders?.length){t+=` ORDER BY ${e.orders.map(e=>`${this.wrapColumn(e.column)} ${e.direction.toUpperCase()}`).join(", ")}`}return null!=e.limit&&(t+=` LIMIT ${e.limit}`),t}compileWheres(e){return e.map((e,t)=>{const n=t>0?` ${e.boolean.toUpperCase()} `:"";switch(e.type){case"basic":return`${n}${this.wrapColumn(e.column)} ${e.operator} ?`;case"in":return`${n}${this.wrapColumn(e.column)} IN (${e.values.map(()=>"?").join(", ")})`;case"notIn":return`${n}${this.wrapColumn(e.column)} NOT IN (${e.values.map(()=>"?").join(", ")})`;case"between":return`${n}${this.wrapColumn(e.column)} BETWEEN ? AND ?`;case"null":return`${n}${this.wrapColumn(e.column)} IS NULL`;case"notNull":return`${n}${this.wrapColumn(e.column)} IS NOT NULL`;case"exists":return`${n}EXISTS (${e.query})`;case"notExists":return`${n}NOT EXISTS (${e.query})`;case"raw":return`${n}${e.sql}`;default:return""}}).join("")}compileJoins(e){return e.map(e=>`${e.type.toUpperCase()} JOIN ${this.wrapTable(e.table)} ON ${this.compileWheres(e.wheres)}`).join(" ")}compileCtes(e){return e.map(e=>`${e.name} AS (${e.query})`).join(", ")}wrapTable(e){return e.includes(".")?e.split(".").map(e=>`\`${e}\``).join("."):`\`${e}\``}wrapColumn(e){return"*"===e?e:e.includes(".")?e.split(".").map(e=>"*"===e?e:`\`${e}\``).join("."):`\`${e}\``}parameter(e){return"?"}getColumnType(e){switch(e.type){case"bigIncrements":case"integer":return"INT";case"bigInteger":return"BIGINT";case"string":return e.length?`VARCHAR(${e.length})`:"VARCHAR(255)";case"text":default:return"TEXT";case"boolean":return"TINYINT(1)";case"decimal":return null!=e.precision&&null!=e.scale?`DECIMAL(${e.precision},${e.scale})`:"DECIMAL";case"float":return"FLOAT";case"double":return"DOUBLE";case"date":return"DATE";case"timestamp":case"dateTime":return"DATETIME";case"time":return"TIME";case"binary":return"BLOB";case"json":return"JSON";case"uuid":return"CHAR(36)"}}formatDefault(e){return"string"==typeof e?`'${e}'`:String(e)}compileCreateTable(e){const t=this.wrapTable(e.name),n=e.columns.map(e=>{const t=[];return t.push(this.wrapColumn(e.name)),t.push(this.getColumnType(e)),e.unsigned&&t.push("UNSIGNED"),t.push(e.nullable?"NULL":"NOT NULL"),e.autoIncrement&&t.push("AUTO_INCREMENT"),null!=e.default&&t.push(`DEFAULT ${this.formatDefault(e.default)}`),t.join(" ")}),r=e.columns.filter(e=>e.primary).map(e=>this.wrapColumn(e.name));return r.length&&n.push(`PRIMARY KEY (${r.join(", ")})`),`CREATE TABLE ${t} (${n.join(", ")})`}compileAlterTable(e){if(!e.columns?.length)throw new Error("No columns provided for ALTER TABLE.");return`ALTER TABLE ${this.wrapTable(e.name)} ${e.columns.map(e=>{const t=["ADD COLUMN",this.wrapColumn(e.name),this.getColumnType(e),e.nullable?"NULL":"NOT NULL"];return null!=e.default&&t.push(`DEFAULT ${this.formatDefault(e.default)}`),t.join(" ")}).join(", ")}`}compileTableExists(e){return"SELECT TABLE_NAME FROM information_schema.tables WHERE table_schema = DATABASE() AND table_name = ?"}compileColumnExists(e,t){return"SELECT COLUMN_NAME FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = ? AND column_name = ?"}async rename(e,t){const n=`RENAME TABLE ${this.wrapTable(e)} TO ${this.wrapTable(t)}`;throw new Error(`Execute SQL: ${n}`)}}class n extends e.DatabaseDriver{mysqlConnection=null;mysqlModule;grammar;constructor(e){super(e),this.grammar=new t}async connect(){this.mysqlModule=await Promise.resolve().then(function(){return require("./promise-D5qiIfy7.js")}).then(function(e){return e.promise});const{createConnection:e}=this.mysqlModule;this.mysqlConnection=await e({host:this.config.host,port:this.config.port??3306,user:this.config.username,password:this.config.password,database:this.config.database,...this.config}),this.mysqlConnection.connect(),this.connection=this.mysqlConnection}async disconnect(){await(this.mysqlConnection?.end()),this.mysqlConnection=null,this.connection=null}async query(e,t=[]){try{const[n]=await this.connection.execute(e,t);return{rows:n,rowCount:Array.isArray(n)?n.length:0}}catch(e){throw new Error(`MySQL query failed: ${e.message}`)}}async prepare(e){const t=await this.connection.prepare(e);return new r(t)}async beginTransaction(){await this.connection.beginTransaction(),this.inTransaction=!0}async commit(){await this.connection.commit(),this.inTransaction=!1}async rollback(){await this.connection.rollback(),this.inTransaction=!1}async getLastInsertId(){const[e]=await this.connection.query("SELECT LAST_INSERT_ID() AS id");return e?.[0]?.id??""}escape(e){return this.mysqlModule.escape(e)}getGrammar(){return this.grammar}supportsFeature(e){return["prepared_statements","transactions","json","batch_operations","foreign_keys","auto_increment"].includes(e)}}class r{statement;constructor(e){this.statement=e}async execute(e){const[t]=await this.statement.execute(e||[]);return{rows:t,rowCount:Array.isArray(t)?t.length:0}}async close(){await this.statement.close()}}exports.MySQLDriver=n;