122 lines
4.4 KiB
JavaScript
122 lines
4.4 KiB
JavaScript
"use strict";
|
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
};
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
const PostgrestQueryBuilder_1 = __importDefault(require("./PostgrestQueryBuilder"));
|
|
const PostgrestFilterBuilder_1 = __importDefault(require("./PostgrestFilterBuilder"));
|
|
const constants_1 = require("./constants");
|
|
/**
|
|
* PostgREST client.
|
|
*
|
|
* @typeParam Database - Types for the schema from the [type
|
|
* generator](https://supabase.com/docs/reference/javascript/next/typescript-support)
|
|
*
|
|
* @typeParam SchemaName - Postgres schema to switch to. Must be a string
|
|
* literal, the same one passed to the constructor. If the schema is not
|
|
* `"public"`, this must be supplied manually.
|
|
*/
|
|
class PostgrestClient {
|
|
// TODO: Add back shouldThrowOnError once we figure out the typings
|
|
/**
|
|
* Creates a PostgREST client.
|
|
*
|
|
* @param url - URL of the PostgREST endpoint
|
|
* @param options - Named parameters
|
|
* @param options.headers - Custom headers
|
|
* @param options.schema - Postgres schema to switch to
|
|
* @param options.fetch - Custom fetch
|
|
*/
|
|
constructor(url, { headers = {}, schema, fetch, } = {}) {
|
|
this.url = url;
|
|
this.headers = Object.assign(Object.assign({}, constants_1.DEFAULT_HEADERS), headers);
|
|
this.schemaName = schema;
|
|
this.fetch = fetch;
|
|
}
|
|
/**
|
|
* Perform a query on a table or a view.
|
|
*
|
|
* @param relation - The table or view name to query
|
|
*/
|
|
from(relation) {
|
|
const url = new URL(`${this.url}/${relation}`);
|
|
return new PostgrestQueryBuilder_1.default(url, {
|
|
headers: Object.assign({}, this.headers),
|
|
schema: this.schemaName,
|
|
fetch: this.fetch,
|
|
});
|
|
}
|
|
/**
|
|
* Select a schema to query or perform an function (rpc) call.
|
|
*
|
|
* The schema needs to be on the list of exposed schemas inside Supabase.
|
|
*
|
|
* @param schema - The schema to query
|
|
*/
|
|
schema(schema) {
|
|
return new PostgrestClient(this.url, {
|
|
headers: this.headers,
|
|
schema,
|
|
fetch: this.fetch,
|
|
});
|
|
}
|
|
/**
|
|
* Perform a function call.
|
|
*
|
|
* @param fn - The function name to call
|
|
* @param args - The arguments to pass to the function call
|
|
* @param options - Named parameters
|
|
* @param options.head - When set to `true`, `data` will not be returned.
|
|
* Useful if you only need the count.
|
|
* @param options.get - When set to `true`, the function will be called with
|
|
* read-only access mode.
|
|
* @param options.count - Count algorithm to use to count rows returned by the
|
|
* function. Only applicable for [set-returning
|
|
* functions](https://www.postgresql.org/docs/current/functions-srf.html).
|
|
*
|
|
* `"exact"`: Exact but slow count algorithm. Performs a `COUNT(*)` under the
|
|
* hood.
|
|
*
|
|
* `"planned"`: Approximated but fast count algorithm. Uses the Postgres
|
|
* statistics under the hood.
|
|
*
|
|
* `"estimated"`: Uses exact count for low numbers and planned count for high
|
|
* numbers.
|
|
*/
|
|
rpc(fn, args = {}, { head = false, get = false, count, } = {}) {
|
|
let method;
|
|
const url = new URL(`${this.url}/rpc/${fn}`);
|
|
let body;
|
|
if (head || get) {
|
|
method = head ? 'HEAD' : 'GET';
|
|
Object.entries(args)
|
|
// params with undefined value needs to be filtered out, otherwise it'll
|
|
// show up as `?param=undefined`
|
|
.filter(([_, value]) => value !== undefined)
|
|
// array values need special syntax
|
|
.map(([name, value]) => [name, Array.isArray(value) ? `{${value.join(',')}}` : `${value}`])
|
|
.forEach(([name, value]) => {
|
|
url.searchParams.append(name, value);
|
|
});
|
|
}
|
|
else {
|
|
method = 'POST';
|
|
body = args;
|
|
}
|
|
const headers = Object.assign({}, this.headers);
|
|
if (count) {
|
|
headers['Prefer'] = `count=${count}`;
|
|
}
|
|
return new PostgrestFilterBuilder_1.default({
|
|
method,
|
|
url,
|
|
headers,
|
|
schema: this.schemaName,
|
|
body,
|
|
fetch: this.fetch,
|
|
allowEmpty: false,
|
|
});
|
|
}
|
|
}
|
|
exports.default = PostgrestClient;
|
|
//# sourceMappingURL=PostgrestClient.js.map
|