import { parseRequest as wasmParseRequest, parseInsert as wasmParseInsert, parseUpdate as wasmParseUpdate, parseDelete as wasmParseDelete, parseRpc as wasmParseRpc, parseOnly as wasmParseOnly, buildFilterClause as wasmBuildFilterClause, } from "./postgrest_parser.js";
export { default as init, initSchemaFromDb, clearSchema, clearAllSchemas } from "./postgrest_parser.js";
function toQueryResult(wasmResult) {
return {
query: wasmResult.query,
params: wasmResult.params,
tables: wasmResult.tables,
};
}
function headersToJson(headers) {
return headers ? JSON.stringify(headers) : undefined;
}
function preferToHeader(prefer) {
if (!prefer)
return undefined;
const parts = [];
if (prefer.return)
parts.push(`return=${prefer.return}`);
if (prefer.resolution)
parts.push(`resolution=${prefer.resolution}`);
if (prefer.missing)
parts.push(`missing=${prefer.missing}`);
if (prefer.count)
parts.push(`count=${prefer.count}`);
return parts.length > 0 ? parts.join(",") : undefined;
}
function buildQueryString(filters, options) {
const parts = [];
if (filters) {
for (const [key, value] of Object.entries(filters)) {
parts.push(`${key}=${value}`);
}
}
if (options?.select) {
const select = Array.isArray(options.select)
? options.select.join(",")
: options.select;
parts.push(`select=${select}`);
}
if (options?.order) {
const order = Array.isArray(options.order)
? options.order.join(",")
: options.order;
parts.push(`order=${order}`);
}
if (options?.limit !== undefined) {
parts.push(`limit=${options.limit}`);
}
if (options?.offset !== undefined) {
parts.push(`offset=${options.offset}`);
}
if (options?.onConflict) {
const onConflict = Array.isArray(options.onConflict)
? options.onConflict.join(",")
: options.onConflict;
parts.push(`on_conflict=${onConflict}`);
}
if (options?.returning) {
const returning = Array.isArray(options.returning)
? options.returning.join(",")
: options.returning;
parts.push(`returning=${returning}`);
}
return parts.join("&");
}
export class PostgRESTParser {
schemaId;
constructor(schemaId) {
this.schemaId = schemaId;
}
parseRequest(method, path, queryString, body, headers) {
const bodyJson = body ? JSON.stringify(body) : undefined;
const headersJson = headers ? headersToJson(headers) : undefined;
const result = wasmParseRequest(method, path, queryString, bodyJson, headersJson, this.schemaId);
return toQueryResult(result);
}
select(table, options = {}) {
const queryString = buildQueryString(options.filters, options);
const headers = options.count
? { Prefer: `count=${options.count}` }
: undefined;
const result = wasmParseRequest("GET", table, queryString, undefined, headersToJson(headers), this.schemaId);
return toQueryResult(result);
}
insert(table, data, options = {}) {
const queryString = buildQueryString(undefined, {
onConflict: options.onConflict,
returning: options.returning,
});
const preferHeader = preferToHeader(options.prefer);
const headers = preferHeader
? { Prefer: preferHeader }
: undefined;
const result = wasmParseInsert(table, JSON.stringify(data), queryString || undefined, headersToJson(headers), this.schemaId);
return toQueryResult(result);
}
upsert(table, data, conflictColumns, options = {}) {
const filters = {};
for (const col of conflictColumns) {
if (col in data) {
filters[col] = `eq.${data[col]}`;
}
}
const queryString = buildQueryString(filters, {
returning: options.returning,
});
const preferHeader = preferToHeader(options.prefer);
const headers = preferHeader
? { Prefer: preferHeader }
: undefined;
const result = wasmParseRequest("PUT", table, queryString, JSON.stringify(data), headersToJson(headers), this.schemaId);
return toQueryResult(result);
}
update(table, data, filters, options = {}) {
const queryString = buildQueryString(filters, {
returning: options.returning,
});
const preferHeader = preferToHeader(options.prefer);
const headers = preferHeader
? { Prefer: preferHeader }
: undefined;
const result = wasmParseUpdate(table, JSON.stringify(data), queryString, headersToJson(headers), this.schemaId);
return toQueryResult(result);
}
delete(table, filters, options = {}) {
const queryString = buildQueryString(filters, {
returning: options.returning,
});
const preferHeader = preferToHeader(options.prefer);
const headers = preferHeader
? { Prefer: preferHeader }
: undefined;
const result = wasmParseDelete(table, queryString, headersToJson(headers), this.schemaId);
return toQueryResult(result);
}
rpc(functionName, args = {}, options = {}) {
const queryString = buildQueryString(options.filters, options);
const result = wasmParseRpc(functionName, JSON.stringify(args), queryString || undefined, undefined, this.schemaId);
return toQueryResult(result);
}
parseOnly(queryString) {
return wasmParseOnly(queryString);
}
buildFilterClause(filters) {
return wasmBuildFilterClause(filters);
}
}
export function createClient(schemaId) {
return new PostgRESTParser(schemaId);
}