@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 +2 -2
- package/dist/client.d.ts.map +1 -1
- package/dist/hooks/use-mutation.d.ts +1 -1
- package/dist/hooks/use-mutation.d.ts.map +1 -1
- package/dist/hooks/use-query.d.ts.map +1 -1
- package/dist/hooks/use-record.d.ts.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +128 -69
- package/dist/provider.d.ts +4 -4
- package/dist/provider.d.ts.map +1 -1
- package/dist/types.d.ts +48 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
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
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,kBAAkB,EAGlB,WAAW,
|
|
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":"
|
|
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":"
|
|
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":"
|
|
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
|
|
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
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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;
|
|
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
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
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
|
-
|
|
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
|
|
321
|
-
|
|
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
|
-
|
|
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
|
-
|
|
362
|
-
let method;
|
|
363
|
-
let body;
|
|
430
|
+
const builder = client.from(table);
|
|
364
431
|
switch (operation) {
|
|
365
432
|
case "create":
|
|
366
|
-
|
|
367
|
-
|
|
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
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
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
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
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
|
-
|
|
395
|
-
|
|
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
|
};
|
package/dist/provider.d.ts
CHANGED
|
@@ -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
|
package/dist/provider.d.ts.map
CHANGED
|
@@ -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;
|
|
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;
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC7D,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/C;AAED,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,OAAO,CAAC,EAAE,cAAc,GAAG,KAAK,CAAC;IACjC;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC;IACtB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B;;;OAGG;IACH,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|