kysely-mapper
Version:
Flexible Kysely-based utility for mapping between tables and objects
153 lines • 8.56 kB
JavaScript
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
};
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
if (kind === "m") throw new TypeError("Private method is not writable");
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
};
var _AbstractTableMapper_baseDeleteQB, _AbstractTableMapper_baseInsertQB, _AbstractTableMapper_baseSelectQB, _AbstractTableMapper_baseUpdateQB;
import { QueryParameterMaker } from 'kysely-params';
import { applyQueryFilter } from '../lib/apply-query-filter.js';
import { MappingDeleteQuery } from '../queries/delete-query.js';
import { MappingSelectQuery } from '../queries/select-query.js';
import { AnyColumnsMappingInsertQuery } from '../queries/any-insert-query.js';
import { AnyColumnsMappingUpdateQuery } from '../queries/any-update-query.js';
/**
* Abstract base class for table mappers. It is abstract because it does not
* provide a way to specify query input and output transforms. Custom table
* mappers should extend this class with means for providing transforms.
* @typeParam DB Interface whose fields are table names defining tables.
* @typeParam TB Name of the table.
* @typeParam KeyColumns Tuple of the names of the table's key columns.
* Defaults to `[]`, indicating no key columns. Supports up to 4 columns.
* @typeParam SelectedColumns Columns to return from selection queries.
* Defaults to `['*']`, returning all columns. May specify aliases.
* @typeParam SelectedObject Type of objects returned by select queries.
* @typeParam InsertedObject Type of objects inserted into the table.
* @typeParam UpdatingObject Type of objects used to update rows of the table.
* @typeParam ReturnCount Type of the count of the number of affected rows.
* @typeParam InsertReturnColumns Columns to return from the table on insert
* queries that return columns. `['*']` returns all columns; `[]` returns
* none. May specify aliases. Defaults to `KeyColumns`.
* @typeParam UpdateReturnColumns Columns to return from the table on update
* queries that return columns. `['*']` returns all columns; `[]` returns
* none and is the default. May specify aliases.
* @typeParam InsertReturn Type returned from inserts. Defaults to an object
* whose properties are the columns of `InsertReturnColumns`.
* @typeParam UpdateReturn Type returned from updates. Defaults to an object
* whose properties are the columns of `UpdateReturnColumns`.
*/
export class AbstractTableMapper {
constructor(db, tableNameOrMapper, settings = {}) {
var _a, _b, _c, _d;
_AbstractTableMapper_baseDeleteQB.set(this, null);
_AbstractTableMapper_baseInsertQB.set(this, null);
_AbstractTableMapper_baseSelectQB.set(this, null);
_AbstractTableMapper_baseUpdateQB.set(this, null);
if (tableNameOrMapper instanceof AbstractTableMapper) {
Object.assign(this, tableNameOrMapper);
}
else {
this.tableName = tableNameOrMapper;
this.settings = settings;
this.keyColumns = (_a = settings.keyColumns) !== null && _a !== void 0 ? _a : [];
this.selectedColumns =
settings.selectedColumns === undefined
? []
: settings.selectedColumns[0] === '*'
? []
: settings.selectedColumns;
this.insertReturnColumns =
(_c = (_b = settings.insertReturnColumns) !== null && _b !== void 0 ? _b : this.keyColumns) !== null && _c !== void 0 ? _c : [];
this.updateReturnColumns = (_d = settings.updateReturnColumns) !== null && _d !== void 0 ? _d : [];
this.transforms = {};
}
this.db = db;
}
delete(filterOrLHS, op, rhs) {
return new MappingDeleteQuery(this.db, filterOrLHS === undefined
? this.getDeleteQB()
: applyQueryFilter(this.db, this.getDeleteQB(), this.keyColumns, filterOrLHS, op, rhs), this.transforms);
}
/**
* Returns a query for inserting rows into the table.
* @returns A mapping query for inserting rows.
*/
insert() {
return new AnyColumnsMappingInsertQuery(this.db, this.getInsertQB(), this.transforms, this.insertReturnColumns);
}
parameterize(factory) {
const parameterMaker = new QueryParameterMaker();
return factory({
mapper: this,
param: parameterMaker.param.bind(parameterMaker),
}).compile();
}
/**
* Returns a reference to a column, which can be a generated string.
* (Shorthand for `db.dynamic.ref(column)`.)
* @param column The column name being referenced.
* @returns A reference to the given column.
*/
ref(column) {
return this.db.dynamic.ref(column);
}
select(filterOrLHS, op, rhs) {
return new MappingSelectQuery(this.db, filterOrLHS === undefined
? this.getSelectQB()
: applyQueryFilter(this.db, this.getSelectQB(), this.keyColumns, filterOrLHS, op, rhs), this.transforms);
}
update(filterOrLHS, op, rhs) {
return new AnyColumnsMappingUpdateQuery(this.db, filterOrLHS === undefined
? this.getUpdateQB()
: applyQueryFilter(this.db, this.getUpdateQB(), this.keyColumns, filterOrLHS, op, rhs), this.transforms, this.updateReturnColumns);
}
/**
* Returns a query builder for deleting rows from the table, caching the
* query builder for use with future deletions.
* @returns A query builder for deleting rows from the table.
*/
getDeleteQB() {
if (__classPrivateFieldGet(this, _AbstractTableMapper_baseDeleteQB, "f") === null) {
__classPrivateFieldSet(this, _AbstractTableMapper_baseDeleteQB, this.db.deleteFrom(this.tableName), "f");
}
return __classPrivateFieldGet(this, _AbstractTableMapper_baseDeleteQB, "f");
}
/**
* Returns a query builder for inserting rows into the table, caching the
* query builder for use with future insertions.
* @returns A query builder for inserting rows into the table.
*/
getInsertQB() {
if (__classPrivateFieldGet(this, _AbstractTableMapper_baseInsertQB, "f") === null) {
__classPrivateFieldSet(this, _AbstractTableMapper_baseInsertQB, this.db.insertInto(this.tableName), "f");
}
return __classPrivateFieldGet(this, _AbstractTableMapper_baseInsertQB, "f");
}
getSelectQB() {
if (__classPrivateFieldGet(this, _AbstractTableMapper_baseSelectQB, "f") === null) {
const selectQB = this.db.selectFrom(this.tableName);
__classPrivateFieldSet(this, _AbstractTableMapper_baseSelectQB, this.selectedColumns.length == 0
? selectQB.selectAll()
: selectQB.select(this.selectedColumns), "f");
}
return __classPrivateFieldGet(this, _AbstractTableMapper_baseSelectQB, "f");
}
/**
* Returns a query builder for updating rows from the table, caching the
* query builder for use with future updates.
* @returns A query builder for updating rows from the table.
*/
getUpdateQB() {
if (__classPrivateFieldGet(this, _AbstractTableMapper_baseUpdateQB, "f") === null) {
__classPrivateFieldSet(this, _AbstractTableMapper_baseUpdateQB, this.db.updateTable(this.tableName), "f");
}
return __classPrivateFieldGet(this, _AbstractTableMapper_baseUpdateQB, "f");
}
}
_AbstractTableMapper_baseDeleteQB = new WeakMap(), _AbstractTableMapper_baseInsertQB = new WeakMap(), _AbstractTableMapper_baseSelectQB = new WeakMap(), _AbstractTableMapper_baseUpdateQB = new WeakMap();
//# sourceMappingURL=abstract-table-mapper.js.map