scyllinx
Version:
A modern TypeScript ORM for ScyllaDB and SQL databases with Laravel-inspired syntax
2 lines (1 loc) • 6.5 kB
JavaScript
;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 r=e.orders.map(e=>`${this.wrapColumn(e.column)} ${e.direction.toUpperCase()}`).join(", ");t.push(`ORDER BY ${r}`)}return null!=e.limit&&t.push(null!=e.offset?`LIMIT ${e.limit} OFFSET ${e.offset}`:`LIMIT ${e.limit}`),t.join(" ")}compileInsert(e){const t=this.wrapTable(e.table),r=Object.keys(e.values).map(e=>this.wrapColumn(e)),n=Object.values(e.values).map(()=>"?");let s=`INSERT INTO ${t} (${r.join(", ")}) VALUES (${n.join(", ")})`;return e.onConflict&&(s+=` ON CONFLICT ${e.onConflict}`),e.returning?.length&&(s+=` RETURNING ${e.returning.join(", ")}`),s}compileUpdate(e){let t=`UPDATE ${this.wrapTable(e.table)} SET ${Object.keys(e.values).map(e=>`${this.wrapColumn(e)} = ?`).join(", ")}`;return e.wheres?.length&&(t+=` WHERE ${this.compileWheres(e.wheres)}`),e.returning?.length&&(t+=` RETURNING ${e.returning.join(", ")}`),t}compileDelete(e){let t=`DELETE FROM ${this.wrapTable(e.table)}`;return e.wheres?.length&&(t+=` WHERE ${this.compileWheres(e.wheres)}`),e.returning?.length&&(t+=` RETURNING ${e.returning.join(", ")}`),t}compileWheres(e){return e.map((e,t)=>{const r=t>0?` ${e.boolean.toUpperCase()} `:"";switch(e.type){case"basic":return`${r}${this.wrapColumn(e.column)} ${e.operator} ?`;case"in":return`${r}${this.wrapColumn(e.column)} IN (${e.values.map(()=>"?").join(", ")})`;case"notIn":return`${r}${this.wrapColumn(e.column)} NOT IN (${e.values.map(()=>"?").join(", ")})`;case"between":return`${r}${this.wrapColumn(e.column)} BETWEEN ? AND ?`;case"null":return`${r}${this.wrapColumn(e.column)} IS NULL`;case"notNull":return`${r}${this.wrapColumn(e.column)} IS NOT NULL`;case"exists":return`${r}EXISTS (${e.query})`;case"notExists":return`${r}NOT EXISTS (${e.query})`;case"raw":return`${r}${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`$${e}`}getColumnType(e){switch(e.type){case"serial":return"SERIAL";case"bigserial":return"BIGSERIAL";case"integer":return"INTEGER";case"bigInteger":return"BIGINT";case"string":return e.length?`VARCHAR(${e.length})`:"VARCHAR";case"text":default:return"TEXT";case"boolean":return"BOOLEAN";case"decimal":return null!=e.precision&&null!=e.scale?`NUMERIC(${e.precision},${e.scale})`:"NUMERIC";case"float":return"REAL";case"double":return"DOUBLE PRECISION";case"date":return"DATE";case"timestamp":return"TIMESTAMP";case"timestamptz":return"TIMESTAMPTZ";case"time":return"TIME";case"interval":return"INTERVAL";case"json":return"JSON";case"jsonb":return"JSONB";case"uuid":return"UUID";case"binary":return"BYTEA"}}formatDefault(e){return"string"==typeof e?`'${e}'`:String(e)}compileCreateTable(e){let t=`CREATE TABLE ${this.wrapTable(e.name)} (${e.columns.map(e=>this.compileColumnDefinition(e)).join(", ")})`;if(e.inherits?.length){t+=` INHERITS (${e.inherits.map(e=>this.wrapTable(e)).join(", ")})`}return t}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=>{let t=`ADD COLUMN ${this.wrapColumn(e.name)} ${this.getColumnType(e)}`;return!1===e.nullable&&(t+=" NOT NULL"),null!=e.default&&(t+=` DEFAULT ${this.formatDefault(e.default)}`),e.unique&&(t+=" UNIQUE"),t}).join(", ")}`}compileTableExists(e){return"SELECT table_name FROM information_schema.tables WHERE table_schema = current_schema() AND table_name = ?"}compileColumnExists(e,t){return"SELECT column_name FROM information_schema.columns WHERE table_schema = current_schema() AND table_name = ? AND column_name = ?"}async rename(e,t){const r=`ALTER TABLE ${this.wrapTable(e)} RENAME TO ${this.wrapTable(t)}`;throw new Error(`Execute SQL: ${r}`)}compileColumnDefinition(e){let t=`${this.wrapColumn(e.name)} ${this.getColumnType(e)}`;return!1===e.nullable&&(t+=" NOT NULL"),null!=e.default&&(t+=` DEFAULT ${this.formatDefault(e.default)}`),e.primary&&(t+=" PRIMARY KEY"),e.unique&&(t+=" UNIQUE"),t}}class r extends e.DatabaseDriver{pool;grammar;constructor(e){super(e),this.grammar=new t}async connect(){const{Pool:e}=await import("pg");this.pool=new e({host:this.config.host,port:this.config.port??5432,user:this.config.username,password:this.config.password,database:this.config.database,...this.config}),this.connection=await this.pool.connect()}async disconnect(){this.pool&&(await this.pool.end(),this.connection=null)}async query(e,t=[]){try{const r=await this.pool.query(e,t);return{rows:r.rows,rowCount:r.rowCount?r.rowCount:0}}catch(e){throw new Error(`PostgreSQL query failed: ${e.message}`)}}async prepare(e){const t=`stmt_${Math.random().toString(36).substring(2,15)}`;return new n(this.pool,e,t)}async beginTransaction(){await this.query("BEGIN"),this.inTransaction=!0}async commit(){await this.query("COMMIT"),this.inTransaction=!1}async rollback(){await this.query("ROLLBACK"),this.inTransaction=!1}async getLastInsertId(){const e=await this.query("SELECT LASTVAL() as id");return e.rows?.[0]?.id??""}escape(e){return null==e?"NULL":"string"==typeof e?`'${e.replace(/'/g,"''")}'`:"boolean"==typeof e?e?"TRUE":"FALSE":String(e)}getGrammar(){return this.grammar}supportsFeature(e){return["prepared_statements","batch_operations","json","transactions","serial_primary_key","returning"].includes(e)}}class n{pool;sql;name;constructor(e,t,r){this.pool=e,this.sql=t,this.name=r}async execute(e){const t=await this.pool.query({name:this.name,text:this.sql,values:e||[]});return{rows:t.rows,rowCount:t.rowCount?t.rowCount:0}}async close(){}}exports.PostgreSQLDriver=r;