UNPKG

@trap_stevo/liveql

Version:

Supercharge your database workflow with a visually clean, ultra-intuitive SQL layer. Chain elegant queries, trigger instant real-time events, and manage schemas effortlessly — all without ORM overhead while blending raw SQL power with modern developer erg

177 lines (176 loc) 6.95 kB
"use strict"; function _classPrivateMethodInitSpec(e, a) { _checkPrivateRedeclaration(e, a), a.add(e); } function _classPrivateFieldInitSpec(e, t, a) { _checkPrivateRedeclaration(e, t), t.set(e, a); } function _checkPrivateRedeclaration(e, t) { if (t.has(e)) throw new TypeError("Cannot initialize the same private elements twice on an object"); } function _classPrivateFieldGet(s, a) { return s.get(_assertClassBrand(s, a)); } function _classPrivateFieldSet(s, a, r) { return s.set(_assertClassBrand(s, a), r), r; } function _assertClassBrand(e, t, n) { if ("function" == typeof e ? e === t : e.has(t)) return arguments.length < 3 ? t : n; throw new TypeError("Private element is not present on this object"); } var _whereClauses = /*#__PURE__*/new WeakMap(); var _insertData = /*#__PURE__*/new WeakMap(); var _updateData = /*#__PURE__*/new WeakMap(); var _deleted = /*#__PURE__*/new WeakMap(); var _paramIndex = /*#__PURE__*/new WeakMap(); var _limit = /*#__PURE__*/new WeakMap(); var _select = /*#__PURE__*/new WeakMap(); var _order = /*#__PURE__*/new WeakMap(); var _dialect = /*#__PURE__*/new WeakMap(); var _client = /*#__PURE__*/new WeakMap(); var _table = /*#__PURE__*/new WeakMap(); var _QueryBuilder_brand = /*#__PURE__*/new WeakSet(); class QueryBuilder { constructor(client, table, dialect = "generic") { _classPrivateMethodInitSpec(this, _QueryBuilder_brand); _classPrivateFieldInitSpec(this, _whereClauses, []); _classPrivateFieldInitSpec(this, _insertData, null); _classPrivateFieldInitSpec(this, _updateData, null); _classPrivateFieldInitSpec(this, _deleted, false); _classPrivateFieldInitSpec(this, _paramIndex, 1); _classPrivateFieldInitSpec(this, _limit, null); _classPrivateFieldInitSpec(this, _select, "*"); _classPrivateFieldInitSpec(this, _order, ""); _classPrivateFieldInitSpec(this, _dialect, void 0); _classPrivateFieldInitSpec(this, _client, void 0); _classPrivateFieldInitSpec(this, _table, void 0); _classPrivateFieldSet(_dialect, this, dialect.toLowerCase()); _classPrivateFieldSet(_client, this, client); _classPrivateFieldSet(_table, this, table); } select(...fields) { _classPrivateFieldSet(_select, this, fields.length ? fields.join(", ") : "*"); return this; } where(field, opOrValue, valueIfOp) { let op = "="; let value; if (valueIfOp !== undefined) { op = opOrValue; value = valueIfOp; } else { value = opOrValue; } _classPrivateFieldGet(_whereClauses, this).push({ opType: "AND", field, op, value }); return this; } and(field, value) { return this.where(field, value); } or(field, opOrValue, valueIfOp) { let op = "="; let value; if (valueIfOp !== undefined) { op = opOrValue; value = valueIfOp; } else { value = opOrValue; } _classPrivateFieldGet(_whereClauses, this).push({ opType: "OR", clause: `${field} ${op} ${_assertClassBrand(_QueryBuilder_brand, this, _placeholder).call(this)}`, value }); return this; } like(field, pattern) { _classPrivateFieldGet(_whereClauses, this).push({ opType: "AND", clause: `${field} LIKE ${_assertClassBrand(_QueryBuilder_brand, this, _placeholder).call(this)}`, value: pattern }); return this; } in(field, values) { const placeholders = values.map(() => _assertClassBrand(_QueryBuilder_brand, this, _placeholder).call(this)).join(", "); _classPrivateFieldGet(_whereClauses, this).push({ opType: "AND", clause: `${field} IN (${placeholders})`, value: values }); return this; } orderBy(field, dir = "ASC") { _classPrivateFieldSet(_order, this, `ORDER BY ${field} ${dir}`); return this; } limit(n) { _classPrivateFieldSet(_limit, this, n); return this; } insert(data) { _classPrivateFieldSet(_insertData, this, Array.isArray(data) ? data : [data]); return this; } update(data) { _classPrivateFieldSet(_updateData, this, data); return this; } delete() { _classPrivateFieldSet(_deleted, this, true); return this; } async run() { _classPrivateFieldSet(_paramIndex, this, 1); let sql = ""; let params = []; if (_classPrivateFieldGet(_insertData, this)) { const keys = Object.keys(_classPrivateFieldGet(_insertData, this)[0]); const rows = _classPrivateFieldGet(_insertData, this).map(row => { keys.forEach(k => params.push(row[k])); return `(${keys.map(() => _assertClassBrand(_QueryBuilder_brand, this, _placeholder).call(this)).join(", ")})`; }).join(", "); sql = `INSERT INTO ${_classPrivateFieldGet(_table, this)} (${keys.join(", ")}) VALUES ${rows}`; } else if (_classPrivateFieldGet(_updateData, this)) { const sets = Object.keys(_classPrivateFieldGet(_updateData, this)).map(k => { params.push(_classPrivateFieldGet(_updateData, this)[k]); return `${k} = ${_assertClassBrand(_QueryBuilder_brand, this, _placeholder).call(this)}`; }).join(", "); sql = `UPDATE ${_classPrivateFieldGet(_table, this)} SET ${sets}`; } else if (_classPrivateFieldGet(_deleted, this)) { sql = `DELETE FROM ${_classPrivateFieldGet(_table, this)}`; } else { sql = `SELECT ${_classPrivateFieldGet(_select, this)} FROM ${_classPrivateFieldGet(_table, this)}`; } if (_classPrivateFieldGet(_whereClauses, this).length) { let clauseS = ""; for (let i = 0; i < _classPrivateFieldGet(_whereClauses, this).length; i++) { const { opType, field, op, value } = _classPrivateFieldGet(_whereClauses, this)[i]; const clause = Array.isArray(value) ? `${field} ${op} (${value.map(() => _assertClassBrand(_QueryBuilder_brand, this, _placeholder).call(this)).join(", ")})` : `${field} ${op} ${_assertClassBrand(_QueryBuilder_brand, this, _placeholder).call(this)}`; if (i === 0) { clauseS += clause; } else { clauseS += ` ${opType} ${clause}`; } if (Array.isArray(value)) { params.push(...value); } else { params.push(value); } } sql += ` WHERE ${clauseS}`; } if (_classPrivateFieldGet(_order, this)) { sql += ` ${_classPrivateFieldGet(_order, this)}`; } if (_classPrivateFieldGet(_limit, this) !== null) { sql += ` LIMIT ${_classPrivateFieldGet(_limit, this)}`; } return _classPrivateFieldGet(_client, this).query(sql, params); } } function _placeholder() { if (_classPrivateFieldGet(_dialect, this) === "postgres") { var _this$paramIndex, _this$paramIndex2; return `$${_classPrivateFieldSet(_paramIndex, this, (_this$paramIndex = _classPrivateFieldGet(_paramIndex, this), _this$paramIndex2 = _this$paramIndex++, _this$paramIndex)), _this$paramIndex2}`; } return "?"; } module.exports = QueryBuilder;