UNPKG

silvie

Version:

Typescript Back-end Framework

155 lines (154 loc) 5.04 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } class JoinConditionBuilder { constructor() { _defineProperty(this, "conditions", void 0); this.conditions = []; } baseOn(type, relation, lhs, operator, rhs) { const condition = { type, relation }; if (lhs instanceof Function) { const conditionBuilder = new JoinConditionBuilder(); lhs(conditionBuilder); condition.type = 'group'; condition.conditions = conditionBuilder.conditions; } else { condition.leftHandSide = lhs; if (rhs === undefined) { if (operator === undefined) { if (!type.endsWith('null')) { throw new Error(`Invalid usage of ${type} on`); } } else { if (!['between', 'not between', 'in', 'not in', 'like', 'not like'].includes(type)) { condition.operator = '='; } condition.rightHandSide = operator; } } else { if (operator) condition.operator = operator; condition.rightHandSide = rhs; } } this.conditions.push(condition); return this; } on(column, operator, value) { return this.baseOn('value', 'and', column, operator, value); } orOn(column, operator, value) { return this.baseOn('value', 'or', column, operator, value); } onNull(column) { return this.baseOn('null', 'and', column); } orOnNull(column) { return this.baseOn('null', 'or', column); } onNotNull(column) { return this.baseOn('not null', 'and', column); } orOnNotNull(column) { return this.baseOn('not null', 'or', column); } onBetween(column, values) { return this.baseOn('between', 'and', column, values); } orOnBetween(column, values) { return this.baseOn('between', 'and', column, values); } onNotBetween(column, values) { return this.baseOn('not between', 'and', column, values); } orOnNotBetween(column, values) { return this.baseOn('not between', 'and', column, values); } onIn(column, values) { return this.baseOn('in', 'and', column, values); } orOnIn(column, values) { return this.baseOn('in', 'or', column, values); } onNotIn(column, values) { return this.baseOn('not in', 'and', column, values); } orOnNotIn(column, values) { return this.baseOn('not in', 'or', column, values); } onLike(column, value) { return this.baseOn('like', 'and', column, value); } orOnLike(column, value) { return this.baseOn('like', 'or', column, value); } onNotLike(column, value) { return this.baseOn('not like', 'and', column, value); } orOnNotLike(column, value) { return this.baseOn('not like', 'or', column, value); } onColumn(firstColumn, operator, secondColumn) { return this.baseOn('column', 'and', firstColumn, operator, secondColumn); } orOnColumn(firstColumn, operator, secondColumn) { return this.baseOn('column', 'or', firstColumn, operator, secondColumn); } onDate(column, operator, value) { return this.baseOn('date', 'and', column, operator, value); } orOnDate(column, operator, value) { return this.baseOn('date', 'or', column, operator, value); } onYear(column, operator, value) { return this.baseOn('year', 'and', column, operator, value); } orOnYear(column, operator, value) { return this.baseOn('year', 'or', column, operator, value); } onMonth(column, operator, value) { return this.baseOn('month', 'and', column, operator, value); } orOnMonth(column, operator, value) { return this.baseOn('month', 'or', column, operator, value); } onDay(column, operator, value) { return this.baseOn('day', 'and', column, operator, value); } orOnDay(column, operator, value) { return this.baseOn('day', 'or', column, operator, value); } onTime(column, operator, value) { return this.baseOn('time', 'and', column, operator, value); } orOnTime(column, operator, value) { return this.baseOn('time', 'or', column, operator, value); } onRaw(query, params) { this.conditions.push({ type: 'raw', relation: 'and', query, params: params || [] }); return this; } orOnRaw(query, params) { this.conditions.push({ type: 'raw', relation: 'or', query, params: params || [] }); return this; } } exports.default = JoinConditionBuilder;