UNPKG

nukak-postgres

Version:

flexible and efficient ORM, with declarative JSON syntax and smart type-safety

60 lines 10.1 kB
import { AbstractSqlDialect } from 'nukak/dialect'; import { getMeta } from 'nukak/entity'; import { filterFieldKeys, getKeys } from 'nukak/util'; import sqlstring from 'sqlstring-sqlite'; export class PostgresDialect extends AbstractSqlDialect { constructor() { super('"', 'BEGIN TRANSACTION'); } insert(entity, payload) { const sql = super.insert(entity, payload); const returning = this.returningId(entity); return `${sql} ${returning}`; } upsert(entity, conflictPaths, payload) { const meta = getMeta(entity); const insert = super.insert(entity, payload); const fields = filterFieldKeys(meta, payload, 'onInsert'); const update = fields .filter((col) => !conflictPaths[col]) .map((col) => `${this.escapeId(col)} = EXCLUDED.${this.escapeId(col)}`) .join(', '); const keysStr = getKeys(conflictPaths) .map((key) => this.escapeId(key)) .join(', '); const returning = this.returningId(entity); return `${insert} ON CONFLICT (${keysStr}) DO UPDATE SET ${update} ${returning}`; } compare(entity, key, val, opts = {}) { if (key === '$text') { const meta = getMeta(entity); const search = val; const fields = search.$fields .map((field) => this.escapeId(meta.fields[field]?.name ?? field)) .join(` || ' ' || `); return `to_tsvector(${fields}) @@ to_tsquery(${this.escape(search.$value)})`; } return super.compare(entity, key, val, opts); } compareFieldOperator(entity, key, op, val, opts = {}) { const comparisonKey = this.getComparisonKey(entity, key, opts); switch (op) { case '$istartsWith': return `${comparisonKey} ILIKE ${this.escape(`${val}%`)}`; case '$iendsWith': return `${comparisonKey} ILIKE ${this.escape(`%${val}`)}`; case '$iincludes': return `${comparisonKey} ILIKE ${this.escape(`%${val}%`)}`; case '$ilike': return `${comparisonKey} ILIKE ${this.escape(val)}`; case '$regex': return `${comparisonKey} ~ ${this.escape(val)}`; default: return super.compareFieldOperator(entity, key, op, val, opts); } } escape(value) { return sqlstring.escape(value); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9zdGdyZXNEaWFsZWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3Bvc3RncmVzRGlhbGVjdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGNBQWMsQ0FBQztBQVd2QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBRSxNQUFNLFlBQVksQ0FBQztBQUN0RCxPQUFPLFNBQVMsTUFBTSxrQkFBa0IsQ0FBQztBQUV6QyxNQUFNLE9BQU8sZUFBZ0IsU0FBUSxrQkFBa0I7SUFDckQ7UUFDRSxLQUFLLENBQUMsR0FBRyxFQUFFLG1CQUFtQixDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVRLE1BQU0sQ0FBSSxNQUFlLEVBQUUsT0FBZ0I7UUFDbEQsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDMUMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMzQyxPQUFPLEdBQUcsR0FBRyxJQUFJLFNBQVMsRUFBRSxDQUFDO0lBQy9CLENBQUM7SUFFUSxNQUFNLENBQUksTUFBZSxFQUFFLGFBQW9DLEVBQUUsT0FBVTtRQUNsRixNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDN0IsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDN0MsTUFBTSxNQUFNLEdBQUcsZUFBZSxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDMUQsTUFBTSxNQUFNLEdBQUcsTUFBTTthQUNsQixNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFD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WyJpbXBvcnQgeyBBYnN0cmFjdFNxbERpYWxlY3QgfSBmcm9tICdudWthay9kaWFsZWN0JztcbmltcG9ydCB7IGdldE1ldGEgfSBmcm9tICdudWthay9lbnRpdHknO1xuaW1wb3J0IHR5cGUge1xuICBGaWVsZEtleSxcbiAgUXVlcnlDb21wYXJpc29uT3B0aW9ucyxcbiAgUXVlcnlDb25mbGljdFBhdGhzLFxuICBRdWVyeU9wdGlvbnMsXG4gIFF1ZXJ5VGV4dFNlYXJjaE9wdGlvbnMsXG4gIFF1ZXJ5V2hlcmVGaWVsZE9wZXJhdG9yTWFwLFxuICBRdWVyeVdoZXJlTWFwLFxuICBUeXBlLFxufSBmcm9tICdudWthay90eXBlJztcbmltcG9ydCB7IGZpbHRlckZpZWxkS2V5cywgZ2V0S2V5cyB9IGZyb20gJ251a2FrL3V0aWwnO1xuaW1wb3J0IHNxbHN0cmluZyBmcm9tICdzcWxzdHJpbmctc3FsaXRlJztcblxuZXhwb3J0IGNsYXNzIFBvc3RncmVzRGlhbGVjdCBleHRlbmRzIEFic3RyYWN0U3FsRGlhbGVjdCB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCdcIicsICdCRUdJTiBUUkFOU0FDVElPTicpO1xuICB9XG5cbiAgb3ZlcnJpZGUgaW5zZXJ0PEU+KGVudGl0eTogVHlwZTxFPiwgcGF5bG9hZDogRSB8IEVbXSk6IHN0cmluZyB7XG4gICAgY29uc3Qgc3FsID0gc3VwZXIuaW5zZXJ0KGVudGl0eSwgcGF5bG9hZCk7XG4gICAgY29uc3QgcmV0dXJuaW5nID0gdGhpcy5yZXR1cm5pbmdJZChlbnRpdHkpO1xuICAgIHJldHVybiBgJHtzcWx9ICR7cmV0dXJuaW5nfWA7XG4gIH1cblxuICBvdmVycmlkZSB1cHNlcnQ8RT4oZW50aXR5OiBUeXBlPEU+LCBjb25mbGljdFBhdGhzOiBRdWVyeUNvbmZsaWN0UGF0aHM8RT4sIHBheWxvYWQ6IEUpOiBzdHJpbmcge1xuICAgIGNvbnN0IG1ldGEgPSBnZXRNZXRhKGVudGl0eSk7XG4gICAgY29uc3QgaW5zZXJ0ID0gc3VwZXIuaW5zZXJ0KGVudGl0eSwgcGF5bG9hZCk7XG4gICAgY29uc3QgZmllbGRzID0gZmlsdGVyRmllbGRLZXlzKG1ldGEsIHBheWxvYWQsICdvbkluc2VydCcpO1xuICAgIGNvbnN0IHVwZGF0ZSA9IGZpZWxkc1xuICAgICAgLmZpbHRlcigoY29sKSA9PiAhY29uZmxpY3RQYXRoc1tjb2xdKVxuICAgICAgLm1hcCgoY29sKSA9PiBgJHt0aGlzLmVzY2FwZUlkKGNvbCl9ID0gRVhDTFVERUQuJHt0aGlzLmVzY2FwZUlkKGNvbCl9YClcbiAgICAgIC5qb2luKCcsICcpO1xuICAgIGNvbnN0IGtleXNTdHIgPSBnZXRLZXlzKGNvbmZsaWN0UGF0aHMpXG4gICAgICAubWFwKChrZXkpID0+IHRoaXMuZXNjYXBlSWQoa2V5KSlcbiAgICAgIC5qb2luKCcsICcpO1xuICAgIGNvbnN0IHJldHVybmluZyA9IHRoaXMucmV0dXJuaW5nSWQoZW50aXR5KTtcbiAgICByZXR1cm4gYCR7aW5zZXJ0fSBPTiBDT05GTElDVCAoJHtrZXlzU3RyfSkgRE8gVVBEQVRFIFNFVCAke3VwZGF0ZX0gJHtyZXR1cm5pbmd9YDtcbiAgfVxuXG4gIG92ZXJyaWRlIGNvbXBhcmU8RSwgSyBleHRlbmRzIGtleW9mIFF1ZXJ5V2hlcmVNYXA8RT4+KFxuICAgIGVudGl0eTogVHlwZTxFPixcbiAgICBrZXk6IEssXG4gICAgdmFsOiBRdWVyeVdoZXJlTWFwPEU+W0tdLFxuICAgIG9wdHM6IFF1ZXJ5Q29tcGFyaXNvbk9wdGlvbnMgPSB7fSxcbiAgKTogc3RyaW5nIHtcbiAgICBpZiAoa2V5ID09PSAnJHRleHQnKSB7XG4gICAgICBjb25zdCBtZXRhID0gZ2V0TWV0YShlbnRpdHkpO1xuICAgICAgY29uc3Qgc2VhcmNoID0gdmFsIGFzIFF1ZXJ5VGV4dFNlYXJjaE9wdGlvbnM8RT47XG4gICAgICBjb25zdCBmaWVsZHMgPSBzZWFyY2guJGZpZWxkc1xuICAgICAgICAubWFwKChmaWVsZCkgPT4gdGhpcy5lc2NhcGVJZChtZXRhLmZpZWxkc1tmaWVsZF0/Lm5hbWUgPz8gZmllbGQpKVxuICAgICAgICAuam9pbihgIHx8ICcgJyB8fCBgKTtcbiAgICAgIHJldHVybiBgdG9fdHN2ZWN0b3IoJHtmaWVsZHN9KSBAQCB0b190c3F1ZXJ5KCR7dGhpcy5lc2NhcGUoc2VhcmNoLiR2YWx1ZSl9KWA7XG4gICAgfVxuICAgIHJldHVybiBzdXBlci5jb21wYXJlKGVudGl0eSwga2V5LCB2YWwsIG9wdHMpO1xuICB9XG5cbiAgb3ZlcnJpZGUgY29tcGFyZUZpZWxkT3BlcmF0b3I8RSwgSyBleHRlbmRzIGtleW9mIFF1ZXJ5V2hlcmVGaWVsZE9wZXJhdG9yTWFwPEU+PihcbiAgICBlbnRpdHk6IFR5cGU8RT4sXG4gICAga2V5OiBGaWVsZEtleTxFPixcbiAgICBvcDogSyxcbiAgICB2YWw6IFF1ZXJ5V2hlcmVGaWVsZE9wZXJhdG9yTWFwPEU+W0tdLFxuICAgIG9wdHM6IFF1ZXJ5T3B0aW9ucyA9IHt9LFxuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IGNvbXBhcmlzb25LZXkgPSB0aGlzLmdldENvbXBhcmlzb25LZXkoZW50aXR5LCBrZXksIG9wdHMpO1xuICAgIHN3aXRjaCAob3ApIHtcbiAgICAgIGNhc2UgJyRpc3RhcnRzV2l0aCc6XG4gICAgICAgIHJldHVybiBgJHtjb21wYXJpc29uS2V5fSBJTElLRSAke3RoaXMuZXNjYXBlKGAke3ZhbH0lYCl9YDtcbiAgICAgIGNhc2UgJyRpZW5kc1dpdGgnOlxuICAgICAgICByZXR1cm4gYCR7Y29tcGFyaXNvbktleX0gSUxJS0UgJHt0aGlzLmVzY2FwZShgJSR7dmFsfWApfWA7XG4gICAgICBjYXNlICckaWluY2x1ZGVzJzpcbiAgICAgICAgcmV0dXJuIGAke2NvbXBhcmlzb25LZXl9IElMSUtFICR7dGhpcy5lc2NhcGUoYCUke3ZhbH0lYCl9YDtcbiAgICAgIGNhc2UgJyRpbGlrZSc6XG4gICAgICAgIHJldHVybiBgJHtjb21wYXJpc29uS2V5fSBJTElLRSAke3RoaXMuZXNjYXBlKHZhbCl9YDtcbiAgICAgIGNhc2UgJyRyZWdleCc6XG4gICAgICAgIHJldHVybiBgJHtjb21wYXJpc29uS2V5fSB+ICR7dGhpcy5lc2NhcGUodmFsKX1gO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHN1cGVyLmNvbXBhcmVGaWVsZE9wZXJhdG9yKGVudGl0eSwga2V5LCBvcCwgdmFsLCBvcHRzKTtcbiAgICB9XG4gIH1cblxuICBvdmVycmlkZSBlc2NhcGUodmFsdWU6IHVua25vd24pOiBzdHJpbmcge1xuICAgIHJldHVybiBzcWxzdHJpbmcuZXNjYXBlKHZhbHVlKTtcbiAgfVxufVxuIl19