@ikeboy003/cloudrest-client 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client.d.ts +20 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +40 -0
- package/dist/client.js.map +1 -0
- package/dist/errors.d.ts +7 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +13 -0
- package/dist/errors.js.map +1 -0
- package/dist/filter.d.ts +17 -0
- package/dist/filter.d.ts.map +1 -0
- package/dist/filter.js +42 -0
- package/dist/filter.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/mutation.d.ts +47 -0
- package/dist/mutation.d.ts.map +1 -0
- package/dist/mutation.js +121 -0
- package/dist/mutation.js.map +1 -0
- package/dist/query.d.ts +56 -0
- package/dist/query.d.ts.map +1 -0
- package/dist/query.js +120 -0
- package/dist/query.js.map +1 -0
- package/dist/rpc.d.ts +10 -0
- package/dist/rpc.d.ts.map +1 -0
- package/dist/rpc.js +50 -0
- package/dist/rpc.js.map +1 -0
- package/dist/serialize.d.ts +2 -0
- package/dist/serialize.d.ts.map +1 -0
- package/dist/serialize.js +46 -0
- package/dist/serialize.js.map +1 -0
- package/dist/types.d.ts +21 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +8 -0
- package/dist/types.js.map +1 -0
- package/package.json +25 -0
- package/src/client.ts +57 -0
- package/src/errors.ts +10 -0
- package/src/filter.ts +50 -0
- package/src/index.ts +14 -0
- package/src/mutation.ts +158 -0
- package/src/query.ts +152 -0
- package/src/rpc.ts +54 -0
- package/src/serialize.ts +38 -0
- package/src/types.ts +31 -0
package/dist/client.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { AnyPaths, ClientOptions, RowOf, TableName } from "./types.js";
|
|
2
|
+
import { QueryBuilder } from "./query.js";
|
|
3
|
+
import { InsertBuilder, UpdateBuilder, DeleteBuilder } from "./mutation.js";
|
|
4
|
+
import { RpcCaller } from "./rpc.js";
|
|
5
|
+
export declare class CloudRestClient<P extends AnyPaths> {
|
|
6
|
+
private readonly ctx;
|
|
7
|
+
constructor(opts: ClientOptions);
|
|
8
|
+
/** Start a typed read query against `table`. */
|
|
9
|
+
from<T extends TableName<P>>(table: T): QueryBuilder<P, T>;
|
|
10
|
+
/** Insert one row or many rows into `table`. Add `.returning()` to get them back. */
|
|
11
|
+
insert<T extends TableName<P>>(table: T, rows: Partial<RowOf<P, T>> | Partial<RowOf<P, T>>[]): InsertBuilder<P, T>;
|
|
12
|
+
/** Update rows in `table` matching subsequent filters. */
|
|
13
|
+
update<T extends TableName<P>>(table: T, patch: Partial<RowOf<P, T>>): UpdateBuilder<P, T>;
|
|
14
|
+
/** Delete rows in `table` matching subsequent filters. */
|
|
15
|
+
delete<T extends TableName<P>>(table: T): DeleteBuilder<P, T>;
|
|
16
|
+
/** Call a Postgres function via `POST /rpc/<fn>`. Awaitable. */
|
|
17
|
+
rpc<Result = unknown>(fn: string, args?: Record<string, unknown>): RpcCaller<Result>;
|
|
18
|
+
}
|
|
19
|
+
export declare function createClient<P extends AnyPaths>(opts: ClientOptions): CloudRestClient<P>;
|
|
20
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5E,OAAO,EAAE,YAAY,EAAoB,MAAM,YAAY,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC5E,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAErC,qBAAa,eAAe,CAAC,CAAC,SAAS,QAAQ;IAC7C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAc;gBAEtB,IAAI,EAAE,aAAa;IAW/B,gDAAgD;IAChD,IAAI,CAAC,CAAC,SAAS,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC;IAI1D,qFAAqF;IACrF,MAAM,CAAC,CAAC,SAAS,SAAS,CAAC,CAAC,CAAC,EAC3B,KAAK,EAAE,CAAC,EACR,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAClD,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC;IAItB,0DAA0D;IAC1D,MAAM,CAAC,CAAC,SAAS,SAAS,CAAC,CAAC,CAAC,EAC3B,KAAK,EAAE,CAAC,EACR,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAC1B,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC;IAItB,0DAA0D;IAC1D,MAAM,CAAC,CAAC,SAAS,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC;IAI7D,gEAAgE;IAChE,GAAG,CAAC,MAAM,GAAG,OAAO,EAClB,EAAE,EAAE,MAAM,EACV,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACjC,SAAS,CAAC,MAAM,CAAC;CAGrB;AAED,wBAAgB,YAAY,CAAC,CAAC,SAAS,QAAQ,EAAE,IAAI,EAAE,aAAa,GAAG,eAAe,CAAC,CAAC,CAAC,CAExF"}
|
package/dist/client.js
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { QueryBuilder } from "./query.js";
|
|
2
|
+
import { InsertBuilder, UpdateBuilder, DeleteBuilder } from "./mutation.js";
|
|
3
|
+
import { RpcCaller } from "./rpc.js";
|
|
4
|
+
export class CloudRestClient {
|
|
5
|
+
ctx;
|
|
6
|
+
constructor(opts) {
|
|
7
|
+
// Trim trailing slash so we can always use `${baseUrl}/table` cleanly.
|
|
8
|
+
const baseUrl = opts.baseUrl.replace(/\/+$/, "");
|
|
9
|
+
this.ctx = {
|
|
10
|
+
baseUrl,
|
|
11
|
+
getToken: opts.getToken,
|
|
12
|
+
fetch: opts.fetch ?? globalThis.fetch.bind(globalThis),
|
|
13
|
+
headers: opts.headers ?? {},
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
/** Start a typed read query against `table`. */
|
|
17
|
+
from(table) {
|
|
18
|
+
return new QueryBuilder(this.ctx, table);
|
|
19
|
+
}
|
|
20
|
+
/** Insert one row or many rows into `table`. Add `.returning()` to get them back. */
|
|
21
|
+
insert(table, rows) {
|
|
22
|
+
return new InsertBuilder(this.ctx, table, rows);
|
|
23
|
+
}
|
|
24
|
+
/** Update rows in `table` matching subsequent filters. */
|
|
25
|
+
update(table, patch) {
|
|
26
|
+
return new UpdateBuilder(this.ctx, table, patch);
|
|
27
|
+
}
|
|
28
|
+
/** Delete rows in `table` matching subsequent filters. */
|
|
29
|
+
delete(table) {
|
|
30
|
+
return new DeleteBuilder(this.ctx, table);
|
|
31
|
+
}
|
|
32
|
+
/** Call a Postgres function via `POST /rpc/<fn>`. Awaitable. */
|
|
33
|
+
rpc(fn, args = {}) {
|
|
34
|
+
return new RpcCaller(this.ctx, fn, args);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
export function createClient(opts) {
|
|
38
|
+
return new CloudRestClient(opts);
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAoB,MAAM,YAAY,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC5E,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAErC,MAAM,OAAO,eAAe;IACT,GAAG,CAAc;IAElC,YAAY,IAAmB;QAC7B,uEAAuE;QACvE,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QACjD,IAAI,CAAC,GAAG,GAAG;YACT,OAAO;YACP,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC;YACtD,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,EAAE;SAC5B,CAAC;IACJ,CAAC;IAED,gDAAgD;IAChD,IAAI,CAAyB,KAAQ;QACnC,OAAO,IAAI,YAAY,CAAO,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACjD,CAAC;IAED,qFAAqF;IACrF,MAAM,CACJ,KAAQ,EACR,IAAmD;QAEnD,OAAO,IAAI,aAAa,CAAO,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IACxD,CAAC;IAED,0DAA0D;IAC1D,MAAM,CACJ,KAAQ,EACR,KAA2B;QAE3B,OAAO,IAAI,aAAa,CAAO,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IACzD,CAAC;IAED,0DAA0D;IAC1D,MAAM,CAAyB,KAAQ;QACrC,OAAO,IAAI,aAAa,CAAO,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAClD,CAAC;IAED,gEAAgE;IAChE,GAAG,CACD,EAAU,EACV,OAAgC,EAAE;QAElC,OAAO,IAAI,SAAS,CAAS,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;IACnD,CAAC;CACF;AAED,MAAM,UAAU,YAAY,CAAqB,IAAmB;IAClE,OAAO,IAAI,eAAe,CAAI,IAAI,CAAC,CAAC;AACtC,CAAC"}
|
package/dist/errors.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,cAAe,SAAQ,KAAK;IAE9B,MAAM,EAAE,MAAM;IACd,UAAU,EAAE,MAAM;IAClB,IAAI,CAAC,EAAE,OAAO;gBAFd,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,IAAI,CAAC,EAAE,OAAO,YAAA;CAKxB"}
|
package/dist/errors.js
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export class CloudRestError extends Error {
|
|
2
|
+
status;
|
|
3
|
+
statusText;
|
|
4
|
+
body;
|
|
5
|
+
constructor(status, statusText, body) {
|
|
6
|
+
super(`${status} ${statusText}`);
|
|
7
|
+
this.status = status;
|
|
8
|
+
this.statusText = statusText;
|
|
9
|
+
this.body = body;
|
|
10
|
+
this.name = "CloudRestError";
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,cAAe,SAAQ,KAAK;IAE9B;IACA;IACA;IAHT,YACS,MAAc,EACd,UAAkB,EAClB,IAAc;QAErB,KAAK,CAAC,GAAG,MAAM,IAAI,UAAU,EAAE,CAAC,CAAC;QAJ1B,WAAM,GAAN,MAAM,CAAQ;QACd,eAAU,GAAV,UAAU,CAAQ;QAClB,SAAI,GAAJ,IAAI,CAAU;QAGrB,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IAC/B,CAAC;CACF"}
|
package/dist/filter.d.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export type IsValue = "null" | "true" | "false" | "unknown";
|
|
2
|
+
export interface FilterEntry {
|
|
3
|
+
column: string;
|
|
4
|
+
expr: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function fEq(column: string, value: unknown): FilterEntry;
|
|
7
|
+
export declare function fNeq(column: string, value: unknown): FilterEntry;
|
|
8
|
+
export declare function fGt(column: string, value: unknown): FilterEntry;
|
|
9
|
+
export declare function fGte(column: string, value: unknown): FilterEntry;
|
|
10
|
+
export declare function fLt(column: string, value: unknown): FilterEntry;
|
|
11
|
+
export declare function fLte(column: string, value: unknown): FilterEntry;
|
|
12
|
+
export declare function fLike(column: string, pattern: string): FilterEntry;
|
|
13
|
+
export declare function fIlike(column: string, pattern: string): FilterEntry;
|
|
14
|
+
export declare function fIn(column: string, values: readonly unknown[]): FilterEntry;
|
|
15
|
+
export declare function fIs(column: string, value: IsValue): FilterEntry;
|
|
16
|
+
export declare function fNot(entry: FilterEntry): FilterEntry;
|
|
17
|
+
//# sourceMappingURL=filter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filter.d.ts","sourceRoot":"","sources":["../src/filter.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;AAE5D,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,WAAW,CAE/D;AACD,wBAAgB,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,WAAW,CAEhE;AACD,wBAAgB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,WAAW,CAE/D;AACD,wBAAgB,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,WAAW,CAEhE;AACD,wBAAgB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,WAAW,CAE/D;AACD,wBAAgB,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,WAAW,CAEhE;AACD,wBAAgB,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,WAAW,CAElE;AACD,wBAAgB,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,WAAW,CAEnE;AACD,wBAAgB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,OAAO,EAAE,GAAG,WAAW,CAE3E;AAED,wBAAgB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,WAAW,CAE/D;AAGD,wBAAgB,IAAI,CAAC,KAAK,EAAE,WAAW,GAAG,WAAW,CAEpD"}
|
package/dist/filter.js
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
// Filter ops — v0 covers the 80% of queries: equality, comparison, set membership,
|
|
2
|
+
// null checks, pattern match. Composite ops (or, and, fts, jsonpath) come later.
|
|
3
|
+
//
|
|
4
|
+
// Each filter contributes one entry to URLSearchParams as `column=op.value`.
|
|
5
|
+
import { serializeValue } from "./serialize.js";
|
|
6
|
+
export function fEq(column, value) {
|
|
7
|
+
return { column, expr: `eq.${serializeValue(value)}` };
|
|
8
|
+
}
|
|
9
|
+
export function fNeq(column, value) {
|
|
10
|
+
return { column, expr: `neq.${serializeValue(value)}` };
|
|
11
|
+
}
|
|
12
|
+
export function fGt(column, value) {
|
|
13
|
+
return { column, expr: `gt.${serializeValue(value)}` };
|
|
14
|
+
}
|
|
15
|
+
export function fGte(column, value) {
|
|
16
|
+
return { column, expr: `gte.${serializeValue(value)}` };
|
|
17
|
+
}
|
|
18
|
+
export function fLt(column, value) {
|
|
19
|
+
return { column, expr: `lt.${serializeValue(value)}` };
|
|
20
|
+
}
|
|
21
|
+
export function fLte(column, value) {
|
|
22
|
+
return { column, expr: `lte.${serializeValue(value)}` };
|
|
23
|
+
}
|
|
24
|
+
export function fLike(column, pattern) {
|
|
25
|
+
return { column, expr: `like.${serializeValue(pattern)}` };
|
|
26
|
+
}
|
|
27
|
+
export function fIlike(column, pattern) {
|
|
28
|
+
return { column, expr: `ilike.${serializeValue(pattern)}` };
|
|
29
|
+
}
|
|
30
|
+
export function fIn(column, values) {
|
|
31
|
+
return { column, expr: `in.${serializeValue(values)}` };
|
|
32
|
+
}
|
|
33
|
+
// `is` is the correct way to check NULL / boolean — `eq.null` is a no-op in SQL.
|
|
34
|
+
export function fIs(column, value) {
|
|
35
|
+
return { column, expr: `is.${value}` };
|
|
36
|
+
}
|
|
37
|
+
// Negate any single-op filter: PostgREST prefixes the operator with `not.`
|
|
38
|
+
// e.g. `column=not.is.null`, `column=not.eq.5`.
|
|
39
|
+
export function fNot(entry) {
|
|
40
|
+
return { column: entry.column, expr: `not.${entry.expr}` };
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=filter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filter.js","sourceRoot":"","sources":["../src/filter.ts"],"names":[],"mappings":"AAAA,mFAAmF;AACnF,iFAAiF;AACjF,EAAE;AACF,6EAA6E;AAE7E,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAShD,MAAM,UAAU,GAAG,CAAC,MAAc,EAAE,KAAc;IAChD,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;AACzD,CAAC;AACD,MAAM,UAAU,IAAI,CAAC,MAAc,EAAE,KAAc;IACjD,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,cAAc,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;AAC1D,CAAC;AACD,MAAM,UAAU,GAAG,CAAC,MAAc,EAAE,KAAc;IAChD,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;AACzD,CAAC;AACD,MAAM,UAAU,IAAI,CAAC,MAAc,EAAE,KAAc;IACjD,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,cAAc,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;AAC1D,CAAC;AACD,MAAM,UAAU,GAAG,CAAC,MAAc,EAAE,KAAc;IAChD,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;AACzD,CAAC;AACD,MAAM,UAAU,IAAI,CAAC,MAAc,EAAE,KAAc;IACjD,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,cAAc,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;AAC1D,CAAC;AACD,MAAM,UAAU,KAAK,CAAC,MAAc,EAAE,OAAe;IACnD,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,cAAc,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;AAC7D,CAAC;AACD,MAAM,UAAU,MAAM,CAAC,MAAc,EAAE,OAAe;IACpD,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,cAAc,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;AAC9D,CAAC;AACD,MAAM,UAAU,GAAG,CAAC,MAAc,EAAE,MAA0B;IAC5D,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;AAC1D,CAAC;AACD,iFAAiF;AACjF,MAAM,UAAU,GAAG,CAAC,MAAc,EAAE,KAAc;IAChD,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,EAAE,EAAE,CAAC;AACzC,CAAC;AACD,2EAA2E;AAC3E,gDAAgD;AAChD,MAAM,UAAU,IAAI,CAAC,KAAkB;IACrC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;AAC7D,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export { createClient, CloudRestClient } from "./client.js";
|
|
2
|
+
export { CloudRestError } from "./errors.js";
|
|
3
|
+
export { QueryBuilder } from "./query.js";
|
|
4
|
+
export { InsertBuilder, UpdateBuilder, DeleteBuilder } from "./mutation.js";
|
|
5
|
+
export { RpcCaller } from "./rpc.js";
|
|
6
|
+
export type { AnyPaths, ClientOptions, RowOf, TableName, TokenGetter, } from "./types.js";
|
|
7
|
+
export type { OrderOptions } from "./query.js";
|
|
8
|
+
export type { IsValue } from "./filter.js";
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC5E,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,YAAY,EACV,QAAQ,EACR,aAAa,EACb,KAAK,EACL,SAAS,EACT,WAAW,GACZ,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,YAAY,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { createClient, CloudRestClient } from "./client.js";
|
|
2
|
+
export { CloudRestError } from "./errors.js";
|
|
3
|
+
export { QueryBuilder } from "./query.js";
|
|
4
|
+
export { InsertBuilder, UpdateBuilder, DeleteBuilder } from "./mutation.js";
|
|
5
|
+
export { RpcCaller } from "./rpc.js";
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC5E,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { AnyPaths, RowOf, TableName } from "./types.js";
|
|
2
|
+
import { type FilterEntry, type IsValue } from "./filter.js";
|
|
3
|
+
import type { ExecContext } from "./query.js";
|
|
4
|
+
declare class FilterableMutation<Row> {
|
|
5
|
+
protected filters: FilterEntry[];
|
|
6
|
+
eq(col: string, v: unknown): this;
|
|
7
|
+
neq(col: string, v: unknown): this;
|
|
8
|
+
gt(col: string, v: unknown): this;
|
|
9
|
+
gte(col: string, v: unknown): this;
|
|
10
|
+
lt(col: string, v: unknown): this;
|
|
11
|
+
lte(col: string, v: unknown): this;
|
|
12
|
+
like(col: string, pat: string): this;
|
|
13
|
+
ilike(col: string, pat: string): this;
|
|
14
|
+
in(col: string, vals: readonly unknown[]): this;
|
|
15
|
+
is(col: string, v: IsValue): this;
|
|
16
|
+
}
|
|
17
|
+
export declare class InsertBuilder<P extends AnyPaths, T extends TableName<P>, Row = RowOf<P, T>> implements PromiseLike<Row[]> {
|
|
18
|
+
private readonly ctx;
|
|
19
|
+
private readonly table;
|
|
20
|
+
private rows;
|
|
21
|
+
private returnRows;
|
|
22
|
+
constructor(ctx: ExecContext, table: T, rows: Partial<Row> | Partial<Row>[]);
|
|
23
|
+
/** Return inserted rows (adds Prefer: return=representation). */
|
|
24
|
+
returning(): this;
|
|
25
|
+
then<R1 = Row[], R2 = never>(onfulfilled?: ((value: Row[]) => R1 | PromiseLike<R1>) | null, onrejected?: ((reason: unknown) => R2 | PromiseLike<R2>) | null): PromiseLike<R1 | R2>;
|
|
26
|
+
}
|
|
27
|
+
export declare class UpdateBuilder<P extends AnyPaths, T extends TableName<P>, Row = RowOf<P, T>> extends FilterableMutation<Row> implements PromiseLike<Row[]> {
|
|
28
|
+
private readonly ctx;
|
|
29
|
+
private readonly table;
|
|
30
|
+
private readonly patch;
|
|
31
|
+
private returnRows;
|
|
32
|
+
constructor(ctx: ExecContext, table: T, patch: Partial<Row>);
|
|
33
|
+
returning(): this;
|
|
34
|
+
private url;
|
|
35
|
+
then<R1 = Row[], R2 = never>(onfulfilled?: ((value: Row[]) => R1 | PromiseLike<R1>) | null, onrejected?: ((reason: unknown) => R2 | PromiseLike<R2>) | null): PromiseLike<R1 | R2>;
|
|
36
|
+
}
|
|
37
|
+
export declare class DeleteBuilder<P extends AnyPaths, T extends TableName<P>, Row = RowOf<P, T>> extends FilterableMutation<Row> implements PromiseLike<Row[]> {
|
|
38
|
+
private readonly ctx;
|
|
39
|
+
private readonly table;
|
|
40
|
+
private returnRows;
|
|
41
|
+
constructor(ctx: ExecContext, table: T);
|
|
42
|
+
returning(): this;
|
|
43
|
+
private url;
|
|
44
|
+
then<R1 = Row[], R2 = never>(onfulfilled?: ((value: Row[]) => R1 | PromiseLike<R1>) | null, onrejected?: ((reason: unknown) => R2 | PromiseLike<R2>) | null): PromiseLike<R1 | R2>;
|
|
45
|
+
}
|
|
46
|
+
export {};
|
|
47
|
+
//# sourceMappingURL=mutation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mutation.d.ts","sourceRoot":"","sources":["../src/mutation.ts"],"names":[],"mappings":"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"}
|
package/dist/mutation.js
ADDED
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
// Mutations: insert / update / delete. PostgREST conventions:
|
|
2
|
+
// - POST /table with array body → insert
|
|
3
|
+
// - PATCH /table?filters → update
|
|
4
|
+
// - DELETE /table?filters → delete
|
|
5
|
+
// - Prefer: return=representation header makes the server return rows.
|
|
6
|
+
import { fEq, fNeq, fGt, fGte, fLt, fLte, fLike, fIlike, fIn, fIs, } from "./filter.js";
|
|
7
|
+
class FilterableMutation {
|
|
8
|
+
filters = [];
|
|
9
|
+
eq(col, v) { this.filters.push(fEq(col, v)); return this; }
|
|
10
|
+
neq(col, v) { this.filters.push(fNeq(col, v)); return this; }
|
|
11
|
+
gt(col, v) { this.filters.push(fGt(col, v)); return this; }
|
|
12
|
+
gte(col, v) { this.filters.push(fGte(col, v)); return this; }
|
|
13
|
+
lt(col, v) { this.filters.push(fLt(col, v)); return this; }
|
|
14
|
+
lte(col, v) { this.filters.push(fLte(col, v)); return this; }
|
|
15
|
+
like(col, pat) { this.filters.push(fLike(col, pat)); return this; }
|
|
16
|
+
ilike(col, pat) { this.filters.push(fIlike(col, pat)); return this; }
|
|
17
|
+
in(col, vals) { this.filters.push(fIn(col, vals)); return this; }
|
|
18
|
+
is(col, v) { this.filters.push(fIs(col, v)); return this; }
|
|
19
|
+
}
|
|
20
|
+
async function send(ctx, method, url, body, returnRepresentation) {
|
|
21
|
+
const headers = {
|
|
22
|
+
Accept: "application/json",
|
|
23
|
+
"Content-Type": "application/json",
|
|
24
|
+
...ctx.headers,
|
|
25
|
+
};
|
|
26
|
+
if (returnRepresentation)
|
|
27
|
+
headers["Prefer"] = "return=representation";
|
|
28
|
+
const token = await ctx.getToken?.();
|
|
29
|
+
if (token)
|
|
30
|
+
headers["Authorization"] = `Bearer ${token}`;
|
|
31
|
+
const res = await ctx.fetch(url, {
|
|
32
|
+
method,
|
|
33
|
+
headers,
|
|
34
|
+
...(body !== undefined ? { body: JSON.stringify(body) } : {}),
|
|
35
|
+
});
|
|
36
|
+
if (!res.ok) {
|
|
37
|
+
const errBody = await res.json().catch(() => null);
|
|
38
|
+
const { CloudRestError } = await import("./errors.js");
|
|
39
|
+
throw new CloudRestError(res.status, res.statusText, errBody);
|
|
40
|
+
}
|
|
41
|
+
if (res.status === 204)
|
|
42
|
+
return [];
|
|
43
|
+
return res.json();
|
|
44
|
+
}
|
|
45
|
+
export class InsertBuilder {
|
|
46
|
+
ctx;
|
|
47
|
+
table;
|
|
48
|
+
rows;
|
|
49
|
+
returnRows = false;
|
|
50
|
+
constructor(ctx, table, rows) {
|
|
51
|
+
this.ctx = ctx;
|
|
52
|
+
this.table = table;
|
|
53
|
+
this.rows = Array.isArray(rows) ? rows : [rows];
|
|
54
|
+
}
|
|
55
|
+
/** Return inserted rows (adds Prefer: return=representation). */
|
|
56
|
+
returning() {
|
|
57
|
+
this.returnRows = true;
|
|
58
|
+
return this;
|
|
59
|
+
}
|
|
60
|
+
then(onfulfilled, onrejected) {
|
|
61
|
+
const url = `${this.ctx.baseUrl}${String(this.table)}`;
|
|
62
|
+
return send(this.ctx, "POST", url, this.rows, this.returnRows)
|
|
63
|
+
.then((v) => v)
|
|
64
|
+
.then(onfulfilled, onrejected);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
export class UpdateBuilder extends FilterableMutation {
|
|
68
|
+
ctx;
|
|
69
|
+
table;
|
|
70
|
+
patch;
|
|
71
|
+
returnRows = false;
|
|
72
|
+
constructor(ctx, table, patch) {
|
|
73
|
+
super();
|
|
74
|
+
this.ctx = ctx;
|
|
75
|
+
this.table = table;
|
|
76
|
+
this.patch = patch;
|
|
77
|
+
}
|
|
78
|
+
returning() {
|
|
79
|
+
this.returnRows = true;
|
|
80
|
+
return this;
|
|
81
|
+
}
|
|
82
|
+
url() {
|
|
83
|
+
const params = new URLSearchParams();
|
|
84
|
+
for (const f of this.filters)
|
|
85
|
+
params.append(f.column, f.expr);
|
|
86
|
+
const qs = params.toString();
|
|
87
|
+
return `${this.ctx.baseUrl}${String(this.table)}${qs ? `?${qs}` : ""}`;
|
|
88
|
+
}
|
|
89
|
+
then(onfulfilled, onrejected) {
|
|
90
|
+
return send(this.ctx, "PATCH", this.url(), this.patch, this.returnRows)
|
|
91
|
+
.then((v) => v)
|
|
92
|
+
.then(onfulfilled, onrejected);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
export class DeleteBuilder extends FilterableMutation {
|
|
96
|
+
ctx;
|
|
97
|
+
table;
|
|
98
|
+
returnRows = false;
|
|
99
|
+
constructor(ctx, table) {
|
|
100
|
+
super();
|
|
101
|
+
this.ctx = ctx;
|
|
102
|
+
this.table = table;
|
|
103
|
+
}
|
|
104
|
+
returning() {
|
|
105
|
+
this.returnRows = true;
|
|
106
|
+
return this;
|
|
107
|
+
}
|
|
108
|
+
url() {
|
|
109
|
+
const params = new URLSearchParams();
|
|
110
|
+
for (const f of this.filters)
|
|
111
|
+
params.append(f.column, f.expr);
|
|
112
|
+
const qs = params.toString();
|
|
113
|
+
return `${this.ctx.baseUrl}${String(this.table)}${qs ? `?${qs}` : ""}`;
|
|
114
|
+
}
|
|
115
|
+
then(onfulfilled, onrejected) {
|
|
116
|
+
return send(this.ctx, "DELETE", this.url(), undefined, this.returnRows)
|
|
117
|
+
.then((v) => v)
|
|
118
|
+
.then(onfulfilled, onrejected);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=mutation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mutation.js","sourceRoot":"","sources":["../src/mutation.ts"],"names":[],"mappings":"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"}
|
package/dist/query.d.ts
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type { AnyPaths, RowOf, TableName } from "./types.js";
|
|
2
|
+
import { type FilterEntry, type IsValue } from "./filter.js";
|
|
3
|
+
import type { CloudRestError } from "./errors.js";
|
|
4
|
+
export interface ExecContext {
|
|
5
|
+
baseUrl: string;
|
|
6
|
+
getToken?: () => string | null | Promise<string | null>;
|
|
7
|
+
fetch: typeof fetch;
|
|
8
|
+
headers: Record<string, string>;
|
|
9
|
+
}
|
|
10
|
+
export interface OrderOptions {
|
|
11
|
+
ascending?: boolean;
|
|
12
|
+
nullsFirst?: boolean;
|
|
13
|
+
}
|
|
14
|
+
export declare class QueryBuilder<P extends AnyPaths, T extends TableName<P>, Row = RowOf<P, T>> implements PromiseLike<Row[]> {
|
|
15
|
+
private readonly ctx;
|
|
16
|
+
private readonly table;
|
|
17
|
+
private filters;
|
|
18
|
+
private selectExpr?;
|
|
19
|
+
private orderExpr?;
|
|
20
|
+
private limitN?;
|
|
21
|
+
private offsetN?;
|
|
22
|
+
private rangeFrom?;
|
|
23
|
+
private rangeTo?;
|
|
24
|
+
private singleMode;
|
|
25
|
+
constructor(ctx: ExecContext, table: T);
|
|
26
|
+
select(columns: string): this;
|
|
27
|
+
eq(col: string, v: unknown): this;
|
|
28
|
+
neq(col: string, v: unknown): this;
|
|
29
|
+
gt(col: string, v: unknown): this;
|
|
30
|
+
gte(col: string, v: unknown): this;
|
|
31
|
+
lt(col: string, v: unknown): this;
|
|
32
|
+
lte(col: string, v: unknown): this;
|
|
33
|
+
like(col: string, pat: string): this;
|
|
34
|
+
ilike(col: string, pat: string): this;
|
|
35
|
+
in(col: string, vals: readonly unknown[]): this;
|
|
36
|
+
is(col: string, v: IsValue): this;
|
|
37
|
+
notIs(col: string, v: IsValue): this;
|
|
38
|
+
not(entry: FilterEntry): this;
|
|
39
|
+
order(column: string, opts?: OrderOptions): this;
|
|
40
|
+
limit(n: number): this;
|
|
41
|
+
offset(n: number): this;
|
|
42
|
+
range(from: number, to: number): this;
|
|
43
|
+
/**
|
|
44
|
+
* Expect exactly one row. Resolves to `Row` (not `Row[]`).
|
|
45
|
+
* Throws if 0 or >1 rows match.
|
|
46
|
+
*/
|
|
47
|
+
single(): SingleQuery<Row>;
|
|
48
|
+
private buildUrl;
|
|
49
|
+
private exec;
|
|
50
|
+
then<TResult1 = Row[], TResult2 = never>(onfulfilled?: ((value: Row[]) => TResult1 | PromiseLike<TResult1>) | null, onrejected?: ((reason: CloudRestError) => TResult2 | PromiseLike<TResult2>) | null): PromiseLike<TResult1 | TResult2>;
|
|
51
|
+
catch<TResult = never>(onrejected?: ((reason: CloudRestError) => TResult | PromiseLike<TResult>) | null): Promise<Row[] | TResult>;
|
|
52
|
+
finally(onfinally?: (() => void) | null): Promise<Row[]>;
|
|
53
|
+
}
|
|
54
|
+
export interface SingleQuery<Row> extends PromiseLike<Row> {
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=query.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"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"}
|
package/dist/query.js
ADDED
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
// Read query builder. Chainable, immutable-ish: each call returns `this` after
|
|
2
|
+
// pushing to internal state. Terminal `then` (PromiseLike) makes the builder
|
|
3
|
+
// awaitable directly:
|
|
4
|
+
//
|
|
5
|
+
// const rows = await db.from("x").select("a,b").eq("a", 1);
|
|
6
|
+
import { fEq, fNeq, fGt, fGte, fLt, fLte, fLike, fIlike, fIn, fIs, fNot, } from "./filter.js";
|
|
7
|
+
export class QueryBuilder {
|
|
8
|
+
ctx;
|
|
9
|
+
table;
|
|
10
|
+
filters = [];
|
|
11
|
+
selectExpr;
|
|
12
|
+
orderExpr;
|
|
13
|
+
limitN;
|
|
14
|
+
offsetN;
|
|
15
|
+
rangeFrom;
|
|
16
|
+
rangeTo;
|
|
17
|
+
singleMode = false;
|
|
18
|
+
constructor(ctx, table) {
|
|
19
|
+
this.ctx = ctx;
|
|
20
|
+
this.table = table;
|
|
21
|
+
}
|
|
22
|
+
// ── projection ──────────────────────────────────────────────────────────
|
|
23
|
+
select(columns) {
|
|
24
|
+
this.selectExpr = columns;
|
|
25
|
+
return this;
|
|
26
|
+
}
|
|
27
|
+
// ── filters ─────────────────────────────────────────────────────────────
|
|
28
|
+
eq(col, v) { this.filters.push(fEq(col, v)); return this; }
|
|
29
|
+
neq(col, v) { this.filters.push(fNeq(col, v)); return this; }
|
|
30
|
+
gt(col, v) { this.filters.push(fGt(col, v)); return this; }
|
|
31
|
+
gte(col, v) { this.filters.push(fGte(col, v)); return this; }
|
|
32
|
+
lt(col, v) { this.filters.push(fLt(col, v)); return this; }
|
|
33
|
+
lte(col, v) { this.filters.push(fLte(col, v)); return this; }
|
|
34
|
+
like(col, pat) { this.filters.push(fLike(col, pat)); return this; }
|
|
35
|
+
ilike(col, pat) { this.filters.push(fIlike(col, pat)); return this; }
|
|
36
|
+
in(col, vals) { this.filters.push(fIn(col, vals)); return this; }
|
|
37
|
+
is(col, v) { this.filters.push(fIs(col, v)); return this; }
|
|
38
|
+
// Negated `is` — e.g. `notIs("col", "null")` → `col=not.is.null`.
|
|
39
|
+
notIs(col, v) { this.filters.push(fNot(fIs(col, v))); return this; }
|
|
40
|
+
// Generic negation: pass the column + a non-negated filter helper output.
|
|
41
|
+
not(entry) { this.filters.push(fNot(entry)); return this; }
|
|
42
|
+
// ── ordering / paging ───────────────────────────────────────────────────
|
|
43
|
+
order(column, opts = {}) {
|
|
44
|
+
const { ascending = true, nullsFirst } = opts;
|
|
45
|
+
const parts = [column, ascending ? "asc" : "desc"];
|
|
46
|
+
if (nullsFirst !== undefined)
|
|
47
|
+
parts.push(nullsFirst ? "nullsfirst" : "nullslast");
|
|
48
|
+
this.orderExpr = (this.orderExpr ? `${this.orderExpr},` : "") + parts.join(".");
|
|
49
|
+
return this;
|
|
50
|
+
}
|
|
51
|
+
limit(n) { this.limitN = n; return this; }
|
|
52
|
+
offset(n) { this.offsetN = n; return this; }
|
|
53
|
+
range(from, to) { this.rangeFrom = from; this.rangeTo = to; return this; }
|
|
54
|
+
// ── result shape ────────────────────────────────────────────────────────
|
|
55
|
+
/**
|
|
56
|
+
* Expect exactly one row. Resolves to `Row` (not `Row[]`).
|
|
57
|
+
* Throws if 0 or >1 rows match.
|
|
58
|
+
*/
|
|
59
|
+
single() {
|
|
60
|
+
this.singleMode = true;
|
|
61
|
+
return this;
|
|
62
|
+
}
|
|
63
|
+
// ── build + execute ─────────────────────────────────────────────────────
|
|
64
|
+
buildUrl() {
|
|
65
|
+
const params = new URLSearchParams();
|
|
66
|
+
if (this.selectExpr)
|
|
67
|
+
params.set("select", this.selectExpr);
|
|
68
|
+
for (const f of this.filters)
|
|
69
|
+
params.append(f.column, f.expr);
|
|
70
|
+
if (this.orderExpr)
|
|
71
|
+
params.set("order", this.orderExpr);
|
|
72
|
+
if (this.limitN !== undefined)
|
|
73
|
+
params.set("limit", String(this.limitN));
|
|
74
|
+
if (this.offsetN !== undefined)
|
|
75
|
+
params.set("offset", String(this.offsetN));
|
|
76
|
+
const qs = params.toString();
|
|
77
|
+
return `${this.ctx.baseUrl}${String(this.table)}${qs ? `?${qs}` : ""}`;
|
|
78
|
+
}
|
|
79
|
+
async exec() {
|
|
80
|
+
const url = this.buildUrl();
|
|
81
|
+
const headers = {
|
|
82
|
+
Accept: "application/json",
|
|
83
|
+
...this.ctx.headers,
|
|
84
|
+
};
|
|
85
|
+
if (this.rangeFrom !== undefined && this.rangeTo !== undefined) {
|
|
86
|
+
headers["Range-Unit"] = "items";
|
|
87
|
+
headers["Range"] = `${this.rangeFrom}-${this.rangeTo}`;
|
|
88
|
+
}
|
|
89
|
+
const token = await this.ctx.getToken?.();
|
|
90
|
+
if (token)
|
|
91
|
+
headers["Authorization"] = `Bearer ${token}`;
|
|
92
|
+
const res = await this.ctx.fetch(url, { method: "GET", headers });
|
|
93
|
+
if (!res.ok) {
|
|
94
|
+
const body = await res.json().catch(() => null);
|
|
95
|
+
const { CloudRestError } = await import("./errors.js");
|
|
96
|
+
throw new CloudRestError(res.status, res.statusText, body);
|
|
97
|
+
}
|
|
98
|
+
const rows = (await res.json());
|
|
99
|
+
if (this.singleMode) {
|
|
100
|
+
if (rows.length !== 1) {
|
|
101
|
+
const { CloudRestError } = await import("./errors.js");
|
|
102
|
+
throw new CloudRestError(rows.length === 0 ? 404 : 409, rows.length === 0 ? "Not Found" : "Conflict", { expected: 1, got: rows.length });
|
|
103
|
+
}
|
|
104
|
+
return rows[0];
|
|
105
|
+
}
|
|
106
|
+
return rows;
|
|
107
|
+
}
|
|
108
|
+
// PromiseLike — `await db.from(...).select(...)` works without `.exec()`.
|
|
109
|
+
then(onfulfilled, onrejected) {
|
|
110
|
+
return this.exec().then(onfulfilled, onrejected);
|
|
111
|
+
}
|
|
112
|
+
// Match Promise surface so `.catch()` / `.finally()` work directly on builders.
|
|
113
|
+
catch(onrejected) {
|
|
114
|
+
return this.exec().catch(onrejected);
|
|
115
|
+
}
|
|
116
|
+
finally(onfinally) {
|
|
117
|
+
return this.exec().finally(onfinally);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=query.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query.js","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"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"}
|
package/dist/rpc.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ExecContext } from "./query.js";
|
|
2
|
+
export declare class RpcCaller<Result = unknown> implements PromiseLike<Result> {
|
|
3
|
+
private readonly ctx;
|
|
4
|
+
private readonly fn;
|
|
5
|
+
private readonly args;
|
|
6
|
+
constructor(ctx: ExecContext, fn: string, args?: Record<string, unknown>);
|
|
7
|
+
private exec;
|
|
8
|
+
then<T1 = Result, T2 = never>(onfulfilled?: ((value: Result) => T1 | PromiseLike<T1>) | null, onrejected?: ((reason: unknown) => T2 | PromiseLike<T2>) | null): PromiseLike<T1 | T2>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=rpc.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rpc.d.ts","sourceRoot":"","sources":["../src/rpc.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAG9C,qBAAa,SAAS,CAAC,MAAM,GAAG,OAAO,CAAE,YAAW,WAAW,CAAC,MAAM,CAAC;IAEnE,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAFJ,GAAG,EAAE,WAAW,EAChB,EAAE,EAAE,MAAM,EACV,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM;YAGvC,IAAI;IA4BlB,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,EAAE,GAAG,KAAK,EAC1B,WAAW,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,KAAK,EAAE,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,EAC9D,UAAU,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,OAAO,KAAK,EAAE,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,GAC9D,WAAW,CAAC,EAAE,GAAG,EAAE,CAAC;CAGxB"}
|