@weirdscience/based-client 0.3.1 → 0.4.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 CHANGED
@@ -1,3 +1,3 @@
1
- import type { BasedClientOptions, BasedClient } from "./types";
2
- export declare function createClient(options: BasedClientOptions): BasedClient;
1
+ import type { BasedClientOptions, BasedClient, DefaultTables } from "./types";
2
+ export declare function createClient<T extends Record<string, Record<string, unknown>> = DefaultTables>(options: BasedClientOptions): BasedClient<T>;
3
3
  //# sourceMappingURL=client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,kBAAkB,EAGlB,WAAW,EAEZ,MAAM,SAAS,CAAC;AAqBjB,wBAAgB,YAAY,CAAC,OAAO,EAAE,kBAAkB,GAAG,WAAW,CAyPrE"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,kBAAkB,EAGlB,WAAW,EAEX,aAAa,EAId,MAAM,SAAS,CAAC;AAsBjB,wBAAgB,YAAY,CAC1B,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,aAAa,EACjE,OAAO,EAAE,kBAAkB,GAAG,WAAW,CAAC,CAAC,CAAC,CAkW7C"}
@@ -1,5 +1,5 @@
1
1
  import type { MutationResult, DefaultTables } from "../types";
2
- type MutationOperation = "create" | "update" | "delete";
2
+ type MutationOperation = "create" | "update" | "upsert" | "delete";
3
3
  export declare function useMutation<T extends Record<string, Record<string, unknown>> = DefaultTables, K extends string & keyof T = string & keyof T>(table: K, operation: MutationOperation): MutationResult<T[K]>;
4
4
  export {};
5
5
  //# sourceMappingURL=use-mutation.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-mutation.d.ts","sourceRoot":"","sources":["../../src/hooks/use-mutation.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE9D,KAAK,iBAAiB,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAExD,wBAAgB,WAAW,CACzB,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,aAAa,EACjE,CAAC,SAAS,MAAM,GAAG,MAAM,CAAC,GAAG,MAAM,GAAG,MAAM,CAAC,EAE7C,KAAK,EAAE,CAAC,EACR,SAAS,EAAE,iBAAiB,GAC3B,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CA0DtB"}
1
+ {"version":3,"file":"use-mutation.d.ts","sourceRoot":"","sources":["../../src/hooks/use-mutation.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE9D,KAAK,iBAAiB,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAEnE,wBAAgB,WAAW,CACzB,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,aAAa,EACjE,CAAC,SAAS,MAAM,GAAG,MAAM,CAAC,GAAG,MAAM,GAAG,MAAM,CAAC,EAE7C,KAAK,EAAE,CAAC,EACR,SAAS,EAAE,iBAAiB,GAC3B,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CA0CtB"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-query.d.ts","sourceRoot":"","sources":["../../src/hooks/use-query.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzE,wBAAgB,QAAQ,CACtB,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,aAAa,EACjE,CAAC,SAAS,MAAM,GAAG,MAAM,CAAC,GAAG,MAAM,GAAG,MAAM,CAAC,EAE7C,KAAK,EAAE,CAAC,EACR,OAAO,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAC3B,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAyDnB"}
1
+ {"version":3,"file":"use-query.d.ts","sourceRoot":"","sources":["../../src/hooks/use-query.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzE,wBAAgB,QAAQ,CACtB,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,aAAa,EACjE,CAAC,SAAS,MAAM,GAAG,MAAM,CAAC,GAAG,MAAM,GAAG,MAAM,CAAC,EAE7C,KAAK,EAAE,CAAC,EACR,OAAO,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAC3B,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CA0CnB"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-record.d.ts","sourceRoot":"","sources":["../../src/hooks/use-record.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE3E,wBAAgB,SAAS,CACvB,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,aAAa,EACjE,CAAC,SAAS,MAAM,GAAG,MAAM,CAAC,GAAG,MAAM,GAAG,MAAM,CAAC,EAE7C,KAAK,EAAE,CAAC,EACR,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAC7B,OAAO,CAAC,EAAE,aAAa,GACtB,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CA8CpB"}
1
+ {"version":3,"file":"use-record.d.ts","sourceRoot":"","sources":["../../src/hooks/use-record.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE3E,wBAAgB,SAAS,CACvB,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,aAAa,EACjE,CAAC,SAAS,MAAM,GAAG,MAAM,CAAC,GAAG,MAAM,GAAG,MAAM,CAAC,EAE7C,KAAK,EAAE,CAAC,EACR,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAC7B,OAAO,CAAC,EAAE,aAAa,GACtB,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAmCpB"}
package/dist/index.d.ts CHANGED
@@ -4,5 +4,6 @@ export { useUser } from "./hooks/use-user";
4
4
  export { useQuery } from "./hooks/use-query";
5
5
  export { useRecord } from "./hooks/use-record";
6
6
  export { useMutation } from "./hooks/use-mutation";
7
- export type { BasedClient, BasedClientOptions, StorageAdapter, AuthUser, AuthState, QueryOptions, QueryResult, RecordOptions, RecordResult, MutationResult, DefaultTables, } from "./types";
7
+ export { BasedError } from "./types";
8
+ export type { BasedClient, BasedClientOptions, BasedTable, ListResult, StorageAdapter, AuthUser, AuthState, QueryOptions, QueryResult, RecordOptions, RecordResult, MutationResult, DefaultTables, } from "./types";
8
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC3D,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEnD,YAAY,EACV,WAAW,EACX,kBAAkB,EAClB,cAAc,EACd,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,WAAW,EACX,aAAa,EACb,YAAY,EACZ,cAAc,EACd,aAAa,GACd,MAAM,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC3D,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAErC,YAAY,EACV,WAAW,EACX,kBAAkB,EAClB,UAAU,EACV,UAAU,EACV,cAAc,EACd,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,WAAW,EACX,aAAa,EACb,YAAY,EACZ,cAAc,EACd,aAAa,GACd,MAAM,SAAS,CAAC"}
package/dist/index.js CHANGED
@@ -1,3 +1,17 @@
1
+ // src/types.ts
2
+ class BasedError extends Error {
3
+ code;
4
+ status;
5
+ details;
6
+ constructor(code, message, status, details) {
7
+ super(message);
8
+ this.name = "BasedError";
9
+ this.code = code;
10
+ this.status = status;
11
+ this.details = details;
12
+ }
13
+ }
14
+
1
15
  // src/client.ts
2
16
  var DEFAULT_STORAGE_KEY = "based.session";
3
17
  function defaultStorage() {
@@ -208,9 +222,89 @@ function createClient(options) {
208
222
  return null;
209
223
  }
210
224
  }
225
+ async function parseOrThrow(res, fallbackCode) {
226
+ let json = {};
227
+ try {
228
+ json = await res.json();
229
+ } catch {}
230
+ if (!res.ok) {
231
+ const err = json.error;
232
+ throw new BasedError(err?.code || fallbackCode, err?.message || `Request failed with status ${res.status}`, res.status, err?.details);
233
+ }
234
+ return json;
235
+ }
236
+ function from(table) {
237
+ const basePath = `/api/${table}`;
238
+ return {
239
+ async select(opts) {
240
+ const params = new URLSearchParams;
241
+ if (opts?.limit !== undefined)
242
+ params.set("limit", String(opts.limit));
243
+ if (opts?.offset !== undefined)
244
+ params.set("offset", String(opts.offset));
245
+ if (opts?.filter) {
246
+ for (const [key, value] of Object.entries(opts.filter)) {
247
+ if (value !== undefined)
248
+ params.set(key, String(value));
249
+ }
250
+ }
251
+ const query = params.toString();
252
+ const res = await fetchWithAuth(`${basePath}${query ? `?${query}` : ""}`);
253
+ const json = await parseOrThrow(res, "SELECT_FAILED");
254
+ return { data: json.data, total: json.total ?? json.data.length };
255
+ },
256
+ async get(id) {
257
+ const res = await fetchWithAuth(`${basePath}/${encodeURIComponent(id)}`);
258
+ if (res.status === 404)
259
+ return null;
260
+ const json = await parseOrThrow(res, "GET_FAILED");
261
+ return json.data;
262
+ },
263
+ async insert(data) {
264
+ const res = await fetchWithAuth(basePath, {
265
+ method: "POST",
266
+ body: JSON.stringify(data)
267
+ });
268
+ const json = await parseOrThrow(res, "INSERT_FAILED");
269
+ return json.data;
270
+ },
271
+ async update(id, data) {
272
+ const body = { ...data };
273
+ delete body.id;
274
+ const res = await fetchWithAuth(`${basePath}/${encodeURIComponent(id)}`, {
275
+ method: "PUT",
276
+ body: JSON.stringify(body)
277
+ });
278
+ const json = await parseOrThrow(res, "UPDATE_FAILED");
279
+ return json.data;
280
+ },
281
+ async upsert(data) {
282
+ const body = { ...data };
283
+ const id = body.id;
284
+ if (!id) {
285
+ throw new BasedError("MISSING_ID", "upsert() requires `data.id`. Use insert() to let the server generate one.", 400);
286
+ }
287
+ delete body.id;
288
+ const res = await fetchWithAuth(`${basePath}/${encodeURIComponent(id)}`, {
289
+ method: "PUT",
290
+ body: JSON.stringify(body)
291
+ });
292
+ const json = await parseOrThrow(res, "UPSERT_FAILED");
293
+ return json.data;
294
+ },
295
+ async delete(id) {
296
+ const res = await fetchWithAuth(`${basePath}/${encodeURIComponent(id)}`, {
297
+ method: "DELETE"
298
+ });
299
+ await parseOrThrow(res, "DELETE_FAILED");
300
+ return { deleted: true };
301
+ }
302
+ };
303
+ }
211
304
  return {
212
305
  auth: { signUp, signIn, signOut, refreshSession, getUser },
213
306
  fetch: fetchWithAuth,
307
+ from,
214
308
  subscribe,
215
309
  getState,
216
310
  ready
@@ -259,32 +353,17 @@ function useQuery(table, options) {
259
353
  const fetchData = useCallback(async () => {
260
354
  setIsLoading(true);
261
355
  setError(null);
262
- const params = new URLSearchParams;
263
- if (options?.limit)
264
- params.set("limit", String(options.limit));
265
- if (options?.offset)
266
- params.set("offset", String(options.offset));
267
- if (options?.filter) {
268
- for (const [key, value] of Object.entries(options.filter)) {
269
- if (value !== undefined)
270
- params.set(key, String(value));
271
- }
272
- }
273
- const query = params.toString();
274
- const path = `/api/${table}${query ? `?${query}` : ""}`;
275
356
  try {
276
- const res = await client.fetch(path);
277
- const json = await res.json();
278
- if (!res.ok) {
279
- setError(json.error || { code: "UNKNOWN", message: "Request failed" });
280
- setData(null);
281
- setTotal(0);
282
- } else {
283
- setData(json.data);
284
- setTotal(json.total ?? 0);
285
- }
357
+ const result = await client.from(table).select({
358
+ filter: options?.filter,
359
+ limit: options?.limit,
360
+ offset: options?.offset
361
+ });
362
+ setData(result.data);
363
+ setTotal(result.total);
286
364
  } catch (err) {
287
- setError({ code: "NETWORK_ERROR", message: err.message });
365
+ const code = err instanceof BasedError ? err.code : "NETWORK_ERROR";
366
+ setError({ code, message: err.message });
288
367
  setData(null);
289
368
  setTotal(0);
290
369
  } finally {
@@ -317,21 +396,11 @@ function useRecord(table, id, options) {
317
396
  setIsLoading(true);
318
397
  setError(null);
319
398
  try {
320
- const res = await client.fetch(`/api/${table}/${encodeURIComponent(id)}`);
321
- const json = await res.json();
322
- if (!res.ok) {
323
- if (res.status === 404) {
324
- setData(null);
325
- setError(null);
326
- } else {
327
- setError(json.error || { code: "UNKNOWN", message: "Request failed" });
328
- setData(null);
329
- }
330
- } else {
331
- setData(json.data);
332
- }
399
+ const row = await client.from(table).get(id);
400
+ setData(row);
333
401
  } catch (err) {
334
- setError({ code: "NETWORK_ERROR", message: err.message });
402
+ const code = err instanceof BasedError ? err.code : "NETWORK_ERROR";
403
+ setError({ code, message: err.message });
335
404
  setData(null);
336
405
  } finally {
337
406
  setIsLoading(false);
@@ -358,42 +427,31 @@ function useMutation(table, operation) {
358
427
  setIsLoading(true);
359
428
  setError(null);
360
429
  try {
361
- let path;
362
- let method;
363
- let body;
430
+ const builder = client.from(table);
364
431
  switch (operation) {
365
432
  case "create":
366
- path = `/api/${table}`;
367
- method = "POST";
368
- body = JSON.stringify(data);
369
- break;
370
- case "update":
433
+ return await builder.insert(data);
434
+ case "update": {
371
435
  if (!data.id)
372
- throw new Error("Update requires an 'id' field");
373
- path = `/api/${table}/${data.id}`;
374
- method = "PUT";
375
- const { id, ...rest } = data;
376
- body = JSON.stringify(rest);
377
- break;
378
- case "delete":
436
+ throw new BasedError("MISSING_ID", "Update requires an 'id' field", 400);
437
+ return await builder.update(String(data.id), data);
438
+ }
439
+ case "upsert": {
379
440
  if (!data.id)
380
- throw new Error("Delete requires an 'id' field");
381
- path = `/api/${table}/${data.id}`;
382
- method = "DELETE";
383
- break;
384
- }
385
- const res = await client.fetch(path, { method, body });
386
- const json = await res.json();
387
- if (!res.ok) {
388
- const err = json.error || { code: "UNKNOWN", message: "Mutation failed" };
389
- setError(err);
390
- throw new Error(err.message);
441
+ throw new BasedError("MISSING_ID", "Upsert requires an 'id' field", 400);
442
+ return await builder.upsert(data);
443
+ }
444
+ case "delete": {
445
+ if (!data.id)
446
+ throw new BasedError("MISSING_ID", "Delete requires an 'id' field", 400);
447
+ await builder.delete(String(data.id));
448
+ return data;
449
+ }
391
450
  }
392
- return json.data;
393
451
  } catch (err) {
394
- if (!error) {
395
- setError({ code: "MUTATION_ERROR", message: err.message });
396
- }
452
+ const code = err instanceof BasedError ? err.code : "MUTATION_ERROR";
453
+ const message = err.message;
454
+ setError({ code, message });
397
455
  throw err;
398
456
  } finally {
399
457
  setIsLoading(false);
@@ -408,5 +466,6 @@ export {
408
466
  useMutation,
409
467
  useBasedClient,
410
468
  createClient,
411
- BasedProvider
469
+ BasedProvider,
470
+ BasedError
412
471
  };
@@ -1,8 +1,8 @@
1
1
  import { type ReactNode } from "react";
2
- import type { BasedClient } from "./types";
3
- export declare function BasedProvider({ client, children, }: {
4
- client: BasedClient;
2
+ import type { BasedClient, DefaultTables } from "./types";
3
+ export declare function BasedProvider<T extends Record<string, Record<string, unknown>> = DefaultTables>({ client, children, }: {
4
+ client: BasedClient<T>;
5
5
  children: ReactNode;
6
6
  }): import("react/jsx-runtime").JSX.Element;
7
- export declare function useBasedClient(): BasedClient;
7
+ export declare function useBasedClient<T extends Record<string, Record<string, unknown>> = DefaultTables>(): BasedClient<T>;
8
8
  //# sourceMappingURL=provider.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../src/provider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA6B,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAClE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAI3C,wBAAgB,aAAa,CAAC,EAC5B,MAAM,EACN,QAAQ,GACT,EAAE;IACD,MAAM,EAAE,WAAW,CAAC;IACpB,QAAQ,EAAE,SAAS,CAAC;CACrB,2CAIA;AAED,wBAAgB,cAAc,IAAI,WAAW,CAM5C"}
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../src/provider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA6B,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAClE,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAI1D,wBAAgB,aAAa,CAC3B,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,aAAa,EACjE,EACA,MAAM,EACN,QAAQ,GACT,EAAE;IACD,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IACvB,QAAQ,EAAE,SAAS,CAAC;CACrB,2CAMA;AAED,wBAAgB,cAAc,CAC5B,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,aAAa,KAC9D,WAAW,CAAC,CAAC,CAAC,CAMlB"}
package/dist/types.d.ts CHANGED
@@ -30,7 +30,7 @@ export interface AuthState {
30
30
  */
31
31
  isLoading: boolean;
32
32
  }
33
- export interface BasedClient {
33
+ export interface BasedClient<T extends Record<string, Record<string, unknown>> = DefaultTables> {
34
34
  auth: {
35
35
  signUp(email: string, password: string): Promise<AuthUser>;
36
36
  signIn(email: string, password: string): Promise<AuthUser>;
@@ -42,6 +42,11 @@ export interface BasedClient {
42
42
  getUser(): Promise<AuthUser | null>;
43
43
  };
44
44
  fetch(path: string, init?: RequestInit): Promise<Response>;
45
+ /**
46
+ * Typed data builder for a table. Exposes `select`, `get`, `insert`,
47
+ * `update`, `upsert`, and `delete`. Methods throw `BasedError` on failure.
48
+ */
49
+ from<K extends string & keyof T>(table: K): BasedTable<T[K]>;
45
50
  subscribe(listener: () => void): () => void;
46
51
  getState(): AuthState;
47
52
  /**
@@ -50,6 +55,48 @@ export interface BasedClient {
50
55
  */
51
56
  ready(): Promise<void>;
52
57
  }
58
+ export interface ListResult<T> {
59
+ data: T[];
60
+ total: number;
61
+ }
62
+ export interface BasedTable<T = Record<string, unknown>> {
63
+ /**
64
+ * List rows with optional filter, limit, and offset. Returns `{ data, total }`.
65
+ */
66
+ select(options?: QueryOptions<T>): Promise<ListResult<T>>;
67
+ /**
68
+ * Fetch a single row by id. Resolves to `null` on 404.
69
+ */
70
+ get(id: string): Promise<T | null>;
71
+ /**
72
+ * Create a row. If `id` is omitted the server generates one.
73
+ */
74
+ insert(data: Partial<T> & Record<string, unknown>): Promise<T>;
75
+ /**
76
+ * Upsert a row at the given id. Creates if missing, updates if present.
77
+ * Wraps PUT /api/:table/:id (RFC 7231 § 4.3.4 upsert semantics).
78
+ */
79
+ update(id: string, data: Partial<T> & Record<string, unknown>): Promise<T>;
80
+ /**
81
+ * Upsert using `data.id` as the key. Equivalent to `update(data.id, data)`
82
+ * but reads more clearly when the caller picks the id themselves.
83
+ */
84
+ upsert(data: Partial<T> & Record<string, unknown> & {
85
+ id: string;
86
+ }): Promise<T>;
87
+ /**
88
+ * Delete a row by id.
89
+ */
90
+ delete(id: string): Promise<{
91
+ deleted: true;
92
+ }>;
93
+ }
94
+ export declare class BasedError extends Error {
95
+ code: string;
96
+ status: number;
97
+ details?: unknown;
98
+ constructor(code: string, message: string, status: number, details?: unknown);
99
+ }
53
100
  export interface QueryOptions<T = Record<string, unknown>> {
54
101
  filter?: Partial<Record<keyof T, string | number | boolean>>;
55
102
  limit?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@weirdscience/based-client",
3
- "version": "0.3.1",
3
+ "version": "0.4.1",
4
4
  "description": "React SDK for Based — a minimal self-hosted BaaS",
5
5
  "license": "MIT",
6
6
  "repository": {