@motherbase/client 2.2.1 → 2.2.3
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/COMPATIBILITY.md +157 -0
- package/LICENSE +21 -21
- package/README.md +52 -4
- package/dist/admin/auth-admin-client.d.ts +43 -0
- package/dist/admin/auth-admin-client.d.ts.map +1 -0
- package/dist/admin/auth-admin-client.js +62 -0
- package/dist/admin/auth-admin-client.js.map +1 -0
- package/dist/admin/auth-admin-mfa-client.d.ts +22 -0
- package/dist/admin/auth-admin-mfa-client.d.ts.map +1 -0
- package/dist/admin/auth-admin-mfa-client.js +17 -0
- package/dist/admin/auth-admin-mfa-client.js.map +1 -0
- package/dist/admin/types.d.ts +85 -0
- package/dist/admin/types.d.ts.map +1 -0
- package/dist/admin/types.js +3 -0
- package/dist/admin/types.js.map +1 -0
- package/dist/auth/constants.d.ts +21 -0
- package/dist/auth/constants.d.ts.map +1 -0
- package/dist/auth/constants.js +34 -0
- package/dist/auth/constants.js.map +1 -0
- package/dist/auth/index.d.ts +5 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +34 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/motherbase-plugin.d.ts +6 -0
- package/dist/auth/motherbase-plugin.d.ts.map +1 -0
- package/dist/auth/motherbase-plugin.js +80 -0
- package/dist/auth/motherbase-plugin.js.map +1 -0
- package/dist/auth/pkce.d.ts +19 -0
- package/dist/auth/pkce.d.ts.map +1 -0
- package/dist/auth/pkce.js +89 -0
- package/dist/auth/pkce.js.map +1 -0
- package/dist/auth/session-utils.d.ts +29 -0
- package/dist/auth/session-utils.d.ts.map +1 -0
- package/dist/auth/session-utils.js +123 -0
- package/dist/auth/session-utils.js.map +1 -0
- package/dist/auth/session.d.ts +51 -0
- package/dist/auth/session.d.ts.map +1 -0
- package/dist/auth/session.js +161 -0
- package/dist/auth/session.js.map +1 -0
- package/dist/auth/types.d.ts +341 -0
- package/dist/auth/types.d.ts.map +1 -0
- package/dist/auth/types.js +2 -0
- package/dist/auth/types.js.map +1 -0
- package/dist/auth/utils.d.ts +28 -0
- package/dist/auth/utils.d.ts.map +1 -0
- package/dist/auth/utils.js +70 -0
- package/dist/auth/utils.js.map +1 -0
- package/dist/auth.d.ts +3 -2
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +27 -11
- package/dist/auth.js.map +1 -1
- package/dist/channel.d.ts +11 -0
- package/dist/channel.d.ts.map +1 -1
- package/dist/channel.js +26 -2
- package/dist/channel.js.map +1 -1
- package/dist/cookies/cookie-storage.d.ts +12 -0
- package/dist/cookies/cookie-storage.d.ts.map +1 -0
- package/dist/cookies/cookie-storage.js +35 -0
- package/dist/cookies/cookie-storage.js.map +1 -0
- package/dist/cookies/index.d.ts +5 -0
- package/dist/cookies/index.d.ts.map +1 -0
- package/dist/cookies/index.js +5 -0
- package/dist/cookies/index.js.map +1 -0
- package/dist/cookies/server-cookie-storage.d.ts +20 -0
- package/dist/cookies/server-cookie-storage.d.ts.map +1 -0
- package/dist/cookies/server-cookie-storage.js +60 -0
- package/dist/cookies/server-cookie-storage.js.map +1 -0
- package/dist/cookies/types.d.ts +33 -0
- package/dist/cookies/types.d.ts.map +1 -0
- package/dist/cookies/types.js +8 -0
- package/dist/cookies/types.js.map +1 -0
- package/dist/cookies/utils.d.ts +23 -0
- package/dist/cookies/utils.d.ts.map +1 -0
- package/dist/cookies/utils.js +67 -0
- package/dist/cookies/utils.js.map +1 -0
- package/dist/database/database.d.ts +197 -0
- package/dist/database/database.d.ts.map +1 -0
- package/dist/database/database.js +2 -0
- package/dist/database/database.js.map +1 -0
- package/dist/database/facade.d.ts +144 -0
- package/dist/database/facade.d.ts.map +1 -0
- package/dist/database/facade.js +147 -0
- package/dist/database/facade.js.map +1 -0
- package/dist/database/query.d.ts +97 -0
- package/dist/database/query.d.ts.map +1 -0
- package/dist/database/query.js +94 -0
- package/dist/database/query.js.map +1 -0
- package/dist/database/types.d.ts +314 -0
- package/dist/database/types.d.ts.map +1 -0
- package/dist/database/types.js +2 -0
- package/dist/database/types.js.map +1 -0
- package/dist/functions/errors.d.ts +28 -0
- package/dist/functions/errors.d.ts.map +1 -0
- package/dist/functions/errors.js +37 -0
- package/dist/functions/errors.js.map +1 -0
- package/dist/functions/index.d.ts +9 -0
- package/dist/functions/index.d.ts.map +1 -0
- package/dist/functions/index.js +40 -0
- package/dist/functions/index.js.map +1 -0
- package/dist/functions/types.d.ts +25 -0
- package/dist/functions/types.d.ts.map +1 -0
- package/dist/functions/types.js +2 -0
- package/dist/functions/types.js.map +1 -0
- package/dist/http/backend-error.d.ts +17 -0
- package/dist/http/backend-error.d.ts.map +1 -0
- package/dist/http/backend-error.js +11 -0
- package/dist/http/backend-error.js.map +1 -0
- package/dist/http/index.d.ts +59 -0
- package/dist/http/index.d.ts.map +1 -0
- package/dist/http/index.js +175 -0
- package/dist/http/index.js.map +1 -0
- package/dist/http/types.d.ts +45 -0
- package/dist/http/types.d.ts.map +1 -0
- package/dist/http/types.js +2 -0
- package/dist/http/types.js.map +1 -0
- package/dist/http/utils.d.ts +14 -0
- package/dist/http/utils.d.ts.map +1 -0
- package/dist/http/utils.js +37 -0
- package/dist/http/utils.js.map +1 -0
- package/dist/http.d.ts.map +1 -1
- package/dist/http.js +2 -1
- package/dist/http.js.map +1 -1
- package/dist/index.d.ts +47 -77
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +58 -73
- package/dist/index.js.map +1 -1
- package/dist/pkce.js +4 -4
- package/dist/postgrest/index.d.ts +4 -0
- package/dist/postgrest/index.d.ts.map +1 -0
- package/dist/postgrest/index.js +4 -0
- package/dist/postgrest/index.js.map +1 -0
- package/dist/postgrest/query-builder.d.ts +224 -0
- package/dist/postgrest/query-builder.d.ts.map +1 -0
- package/dist/postgrest/query-builder.js +544 -0
- package/dist/postgrest/query-builder.js.map +1 -0
- package/dist/postgrest/rpc.d.ts +12 -0
- package/dist/postgrest/rpc.d.ts.map +1 -0
- package/dist/postgrest/rpc.js +42 -0
- package/dist/postgrest/rpc.js.map +1 -0
- package/dist/postgrest/types.d.ts +88 -0
- package/dist/postgrest/types.d.ts.map +1 -0
- package/dist/postgrest/types.js +2 -0
- package/dist/postgrest/types.js.map +1 -0
- package/dist/postgrest/utils.d.ts +23 -0
- package/dist/postgrest/utils.d.ts.map +1 -0
- package/dist/postgrest/utils.js +87 -0
- package/dist/postgrest/utils.js.map +1 -0
- package/dist/postgrest.d.ts +5 -1
- package/dist/postgrest.d.ts.map +1 -1
- package/dist/postgrest.js +17 -10
- package/dist/postgrest.js.map +1 -1
- package/dist/realtime/channel.d.ts +83 -0
- package/dist/realtime/channel.d.ts.map +1 -0
- package/dist/realtime/channel.js +240 -0
- package/dist/realtime/channel.js.map +1 -0
- package/dist/realtime/index.d.ts +94 -0
- package/dist/realtime/index.d.ts.map +1 -0
- package/dist/realtime/index.js +455 -0
- package/dist/realtime/index.js.map +1 -0
- package/dist/realtime/types.d.ts +120 -0
- package/dist/realtime/types.d.ts.map +1 -0
- package/dist/realtime/types.js +2 -0
- package/dist/realtime/types.js.map +1 -0
- package/dist/realtime.d.ts +1 -0
- package/dist/realtime.d.ts.map +1 -1
- package/dist/realtime.js +26 -1
- package/dist/realtime.js.map +1 -1
- package/dist/runtime.d.ts +13 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +15 -0
- package/dist/runtime.js.map +1 -0
- package/dist/session.d.ts +2 -0
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +11 -2
- package/dist/session.js.map +1 -1
- package/dist/storage/bucket.d.ts +166 -0
- package/dist/storage/bucket.d.ts.map +1 -0
- package/dist/storage/bucket.js +294 -0
- package/dist/storage/bucket.js.map +1 -0
- package/dist/storage/index.d.ts +45 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +55 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/types.d.ts +131 -0
- package/dist/storage/types.d.ts.map +1 -0
- package/dist/storage/types.js +2 -0
- package/dist/storage/types.js.map +1 -0
- package/dist/storage/utils.d.ts +27 -0
- package/dist/storage/utils.d.ts.map +1 -0
- package/dist/storage/utils.js +43 -0
- package/dist/storage/utils.js.map +1 -0
- package/dist/test.d.ts +2 -0
- package/dist/test.d.ts.map +1 -0
- package/dist/test.js +3 -0
- package/dist/test.js.map +1 -0
- package/dist/types.d.ts +14 -249
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/compat.d.ts +40 -0
- package/dist/utils/compat.d.ts.map +1 -0
- package/dist/utils/compat.js +100 -0
- package/dist/utils/compat.js.map +1 -0
- package/dist/utils/runtime.d.ts +13 -0
- package/dist/utils/runtime.d.ts.map +1 -0
- package/dist/utils/runtime.js +15 -0
- package/dist/utils/runtime.js.map +1 -0
- package/dist/utils/testing.d.ts +38 -0
- package/dist/utils/testing.d.ts.map +1 -0
- package/dist/utils/testing.js +50 -0
- package/dist/utils/testing.js.map +1 -0
- package/dist/utils/warn.d.ts +2 -0
- package/dist/utils/warn.d.ts.map +1 -0
- package/dist/utils/warn.js +23 -0
- package/dist/utils/warn.js.map +1 -0
- package/package.json +13 -11
- package/dist/devices.d.ts +0 -13
- package/dist/devices.d.ts.map +0 -1
- package/dist/devices.js +0 -13
- package/dist/devices.js.map +0 -1
- package/dist/profile.d.ts +0 -16
- package/dist/profile.d.ts.map +0 -1
- package/dist/profile.js +0 -26
- package/dist/profile.js.map +0 -1
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
let warnedAboutCookieWrite = false;
|
|
2
|
+
/** Browsers drop a cookie past ~4096 bytes, silently signing the user out. */
|
|
3
|
+
const COOKIE_WARN_LENGTH = 3800;
|
|
4
|
+
let warnedAboutCookieSize = false;
|
|
5
|
+
/**
|
|
6
|
+
* `process` is not declared in this package's lib (it targets the browser), so
|
|
7
|
+
* read it off `globalThis` rather than pulling in @types/node for one check.
|
|
8
|
+
* @internal
|
|
9
|
+
*/
|
|
10
|
+
export function isProduction() {
|
|
11
|
+
const proc = globalThis.process;
|
|
12
|
+
return proc?.env?.NODE_ENV === 'production';
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* The single most expensive failure in an SSR setup is silent: the session
|
|
16
|
+
* cookie is never written, so `auth.getSession()` returns null everywhere
|
|
17
|
+
* and no Authorization header is ever attached, with nothing in the logs.
|
|
18
|
+
*
|
|
19
|
+
* It happens because Next.js forbids writing cookies from a Server Component,
|
|
20
|
+
* and the documented adapter shape swallows that failure in its own try/catch.
|
|
21
|
+
* The cookie has to be written from middleware instead, which is what
|
|
22
|
+
* `updateSession` from `@motherbase/ssr` is for. Say so, once, in development.
|
|
23
|
+
*/
|
|
24
|
+
export function warnSessionCookieUnwritable(reason) {
|
|
25
|
+
if (warnedAboutCookieWrite)
|
|
26
|
+
return;
|
|
27
|
+
if (isProduction())
|
|
28
|
+
return;
|
|
29
|
+
warnedAboutCookieWrite = true;
|
|
30
|
+
console.warn(`[motherbase] The session cookie could not be written (${reason}). Server Components cannot `
|
|
31
|
+
+ 'set cookies, so the session has to be refreshed in middleware: call `updateSession` from '
|
|
32
|
+
+ '`@motherbase/ssr` in `proxy.ts` (Next.js 16+) or `middleware.ts` (Next.js 14/15). Until '
|
|
33
|
+
+ 'then auth.getSession() returns null on every request.');
|
|
34
|
+
}
|
|
35
|
+
export function escapeRegex(s) {
|
|
36
|
+
return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
37
|
+
}
|
|
38
|
+
/** @internal exported for tests; not part of the package's public surface. */
|
|
39
|
+
export function parseSession(raw) {
|
|
40
|
+
if (!raw)
|
|
41
|
+
return null;
|
|
42
|
+
// Server adapters (Next's `cookies()`) hand back an already-decoded value;
|
|
43
|
+
// `document.cookie` hands back the percent-encoded one. Try both.
|
|
44
|
+
try {
|
|
45
|
+
return JSON.parse(raw);
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
/* not plain JSON: fall through */
|
|
49
|
+
}
|
|
50
|
+
try {
|
|
51
|
+
return JSON.parse(decodeURIComponent(raw));
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
export function serializeSession(session) {
|
|
58
|
+
const value = encodeURIComponent(JSON.stringify(session));
|
|
59
|
+
if (!warnedAboutCookieSize && value.length > COOKIE_WARN_LENGTH && !isProduction()) {
|
|
60
|
+
warnedAboutCookieSize = true;
|
|
61
|
+
console.warn(`[motherbase] The serialized session is ${value.length} characters, close to the ~4096 byte `
|
|
62
|
+
+ 'browser cookie limit. An oversized cookie is dropped silently and the user appears signed '
|
|
63
|
+
+ 'out. Trim custom user metadata, or use `localStorageStorage()` for the browser client.');
|
|
64
|
+
}
|
|
65
|
+
return value;
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/cookies/utils.ts"],"names":[],"mappings":"AAGA,IAAI,sBAAsB,GAAG,KAAK,CAAC;AAEnC,8EAA8E;AAC9E,MAAM,kBAAkB,GAAG,IAAI,CAAC;AAChC,IAAI,qBAAqB,GAAG,KAAK,CAAC;AAElC;;;;GAIG;AACH,MAAM,UAAU,YAAY;IACxB,MAAM,IAAI,GAAI,UAAyE,CAAC,OAAO,CAAC;IAChG,OAAO,IAAI,EAAE,GAAG,EAAE,QAAQ,KAAK,YAAY,CAAC;AAChD,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,2BAA2B,CAAC,MAAc;IACtD,IAAI,sBAAsB;QAAE,OAAO;IACnC,IAAI,YAAY,EAAE;QAAE,OAAO;IAC3B,sBAAsB,GAAG,IAAI,CAAC;IAC9B,OAAO,CAAC,IAAI,CACR,yDAAyD,MAAM,8BAA8B;UAC3F,2FAA2F;UAC3F,0FAA0F;UAC1F,uDAAuD,CAC5D,CAAC;AACN,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,CAAS;IACjC,OAAO,CAAC,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;AACpD,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,YAAY,CAAC,GAAuB;IAChD,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,2EAA2E;IAC3E,kEAAkE;IAClE,IAAI,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAY,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACL,kCAAkC;IACtC,CAAC;IACD,IAAI,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAY,CAAC;IAC1D,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,IAAI,CAAC;IAChB,CAAC;AACL,CAAC;AAID,MAAM,UAAU,gBAAgB,CAAC,OAAgB;IAC7C,MAAM,KAAK,GAAG,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;IAC1D,IAAI,CAAC,qBAAqB,IAAI,KAAK,CAAC,MAAM,GAAG,kBAAkB,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC;QACjF,qBAAqB,GAAG,IAAI,CAAC;QAC7B,OAAO,CAAC,IAAI,CACR,0CAA0C,KAAK,CAAC,MAAM,uCAAuC;cAC3F,4FAA4F;cAC5F,wFAAwF,CAC7F,CAAC;IACN,CAAC;IACD,OAAO,KAAK,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type-level plumbing for `createClient<Database>(url, key)`.
|
|
3
|
+
*
|
|
4
|
+
* `Database` is the type generated by `motherbase gen types typescript`, which
|
|
5
|
+
* emits the exact shape supabase-js emits. Everything here reads that shape and
|
|
6
|
+
* nothing else, so a `database.types.ts` produced by Supabase's own generator
|
|
7
|
+
* works unchanged.
|
|
8
|
+
*
|
|
9
|
+
* This file is types only: it contains no runtime code. The query builder it
|
|
10
|
+
* describes is the existing `PostgrestQueryBuilder`; `MotherbaseClient.from()`
|
|
11
|
+
* hands back the same object viewed through this narrower interface.
|
|
12
|
+
*/
|
|
13
|
+
import type { ExplainOptions, InsertOptions, MutateOptions, OrderOptions, PaginateOptions, PostgrestArrayOperand, PostgrestExplainBuilder, PostgrestFilterOperator, PostgrestIsValue, PostgrestResponse, PostgrestTextBuilder, ReferencedTableOption, SelectOptions, TextSearchType, UpsertOptions } from '../postgrest/index.js';
|
|
14
|
+
export interface GenericTable {
|
|
15
|
+
Row: Record<string, unknown>;
|
|
16
|
+
Insert: Record<string, unknown>;
|
|
17
|
+
Update: Record<string, unknown>;
|
|
18
|
+
Relationships?: unknown;
|
|
19
|
+
}
|
|
20
|
+
export interface GenericView {
|
|
21
|
+
Row: Record<string, unknown>;
|
|
22
|
+
Relationships?: unknown;
|
|
23
|
+
}
|
|
24
|
+
export interface GenericFunction {
|
|
25
|
+
Args: Record<string, unknown>;
|
|
26
|
+
Returns: unknown;
|
|
27
|
+
}
|
|
28
|
+
export interface GenericSchema {
|
|
29
|
+
Tables: Record<string, GenericTable>;
|
|
30
|
+
Views: Record<string, GenericView>;
|
|
31
|
+
Functions: Record<string, GenericFunction>;
|
|
32
|
+
Enums?: Record<string, unknown>;
|
|
33
|
+
CompositeTypes?: Record<string, unknown>;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* The default when no `Database` is supplied. Every relation name is accepted
|
|
37
|
+
* and every row is `Record<string, unknown>`, which is exactly how the SDK
|
|
38
|
+
* behaved before generics existed. Passing a generated `Database` is opt-in.
|
|
39
|
+
*/
|
|
40
|
+
export type GenericDatabase = Record<string, GenericSchema>;
|
|
41
|
+
/**
|
|
42
|
+
* The schema a client reads by default. `public` when the database has one,
|
|
43
|
+
* otherwise whatever single schema was generated: `motherbase gen types
|
|
44
|
+
* typescript --schema shop` emits only `shop`, and requiring every call site to
|
|
45
|
+
* pass the name again would be pure friction.
|
|
46
|
+
*/
|
|
47
|
+
export type DefaultSchemaName<Database> = 'public' extends keyof Database ? 'public' : keyof Database;
|
|
48
|
+
export type SchemaOf<Database, Name> = Name extends keyof Database ? Database[Name] extends GenericSchema ? Database[Name] : GenericSchema : GenericSchema;
|
|
49
|
+
/** Tables and views together: both are selectable through `.from()`. */
|
|
50
|
+
export type Relations<Schema extends GenericSchema> = Schema['Tables'] & Schema['Views'];
|
|
51
|
+
export type RelationName<Schema extends GenericSchema> = string & keyof Relations<Schema>;
|
|
52
|
+
export type RowOf<Schema extends GenericSchema, Name extends RelationName<Schema>> = Relations<Schema>[Name] extends {
|
|
53
|
+
Row: infer R;
|
|
54
|
+
} ? R : never;
|
|
55
|
+
export type InsertOf<Schema extends GenericSchema, Name extends RelationName<Schema>> = Name extends keyof Schema['Tables'] ? Schema['Tables'][Name] extends {
|
|
56
|
+
Insert: infer I;
|
|
57
|
+
} ? I : never : never;
|
|
58
|
+
export type UpdateOf<Schema extends GenericSchema, Name extends RelationName<Schema>> = Name extends keyof Schema['Tables'] ? Schema['Tables'][Name] extends {
|
|
59
|
+
Update: infer U;
|
|
60
|
+
} ? U : never : never;
|
|
61
|
+
export type FunctionName<Schema extends GenericSchema> = string & keyof Schema['Functions'];
|
|
62
|
+
export type FunctionArgs<Schema extends GenericSchema, Name extends FunctionName<Schema>> = Schema['Functions'][Name] extends {
|
|
63
|
+
Args: infer A;
|
|
64
|
+
} ? A : never;
|
|
65
|
+
export type FunctionReturns<Schema extends GenericSchema, Name extends FunctionName<Schema>> = Schema['Functions'][Name] extends {
|
|
66
|
+
Returns: infer R;
|
|
67
|
+
} ? R : never;
|
|
68
|
+
type Trim<S extends string> = S extends ` ${infer Rest}` ? Trim<Rest> : S extends `${infer Rest} ` ? Trim<Rest> : S;
|
|
69
|
+
/** `'id, name'` -> `'id' | 'name'`. */
|
|
70
|
+
type SplitColumns<S extends string> = S extends `${infer Head},${infer Tail}` ? Trim<Head> | SplitColumns<Tail> : Trim<S>;
|
|
71
|
+
/** `'created_at::text'` -> `'created_at'`. Casts change the wire type, not the source column. */
|
|
72
|
+
type StripCast<S extends string> = S extends `${infer Column}::${string}` ? Column : S;
|
|
73
|
+
type AliasPart<S extends string> = S extends `${infer Alias}:${string}` ? Alias : S;
|
|
74
|
+
type ColumnPart<S extends string> = S extends `${string}:${infer Column}` ? Column : S;
|
|
75
|
+
/** `'writer:author_id'` -> `'writer'` (the key the row will carry). */
|
|
76
|
+
type OutputName<S extends string> = AliasPart<StripCast<S>>;
|
|
77
|
+
/** `'writer:author_id'` -> `'author_id'` (the column the type comes from). */
|
|
78
|
+
type SourceName<S extends string> = ColumnPart<StripCast<S>>;
|
|
79
|
+
/**
|
|
80
|
+
* SEAM: relational embedding (`select=*,author(*)`) is not implemented on the
|
|
81
|
+
* server yet, so a select string containing a parenthesised relation is not
|
|
82
|
+
* narrowed. It resolves to the base row plus an open index signature, which
|
|
83
|
+
* types the columns we do know and leaves the embedded keys accessible without
|
|
84
|
+
* pretending we know their shape.
|
|
85
|
+
*
|
|
86
|
+
* When embedding lands, replace this with a resolver that walks
|
|
87
|
+
* `Relationships` to decide object vs array and recurse into the target row.
|
|
88
|
+
*/
|
|
89
|
+
export type EmbeddedSelectSeam<Row> = Row & Record<string, unknown>;
|
|
90
|
+
type IsEmbeddedSelect<S extends string> = S extends `${string}(${string}` ? true : false;
|
|
91
|
+
/** Columns named in the select string that the relation does not have. */
|
|
92
|
+
export type UnknownSelectColumns<Row, S extends string> = Exclude<SourceName<SplitColumns<S>>, (keyof Row & string) | '*'>;
|
|
93
|
+
/**
|
|
94
|
+
* The `columns` argument type. Resolves to `unknown` (no extra constraint) when
|
|
95
|
+
* every named column exists, and to an error-message string literal otherwise,
|
|
96
|
+
* so a typo fails at the call site with the offending name in the message.
|
|
97
|
+
*/
|
|
98
|
+
export type ValidateSelect<Row, S extends string> = IsEmbeddedSelect<S> extends true ? unknown : [UnknownSelectColumns<Row, S>] extends [never] ? unknown : `Unknown column in select: ${UnknownSelectColumns<Row, S> & string}`;
|
|
99
|
+
/** The row shape a select resolves to. */
|
|
100
|
+
export type SelectResult<Row, S extends string> = IsEmbeddedSelect<S> extends true ? EmbeddedSelectSeam<Row> : '*' extends SplitColumns<S> ? Row : {
|
|
101
|
+
[K in SplitColumns<S> as OutputName<K>]: Row[SourceName<K> & keyof Row];
|
|
102
|
+
};
|
|
103
|
+
export type FilterValue = string | number | boolean | null;
|
|
104
|
+
/** A write without `.select()` stays `null` through re-typing and `.single()`. */
|
|
105
|
+
type RowsUnlessWrite<Data, Rows> = Data extends null ? null : Rows;
|
|
106
|
+
/** Columns that can be filtered or ordered on. Any string when untyped. */
|
|
107
|
+
export type ColumnName<Row> = keyof Row & string;
|
|
108
|
+
/**
|
|
109
|
+
* The `.from()` result. Structurally the existing `PostgrestQueryBuilder`, with
|
|
110
|
+
* the generated row/insert/update types threaded through. `Result` tracks what
|
|
111
|
+
* the current `select` narrowed the row to; it starts as the full row.
|
|
112
|
+
*
|
|
113
|
+
* `Data` is what awaiting resolves to. A write is sent with `return=minimal`
|
|
114
|
+
* and resolves `data: null` until `.select()` asks for the rows back, as in
|
|
115
|
+
* supabase-js; typing it as rows let `data.id` after a bare `insert()` compile
|
|
116
|
+
* and fail at runtime.
|
|
117
|
+
*/
|
|
118
|
+
export interface TypedQuery<Row, Insert, Update, Result = Row, Data = Result[]> extends PromiseLike<PostgrestResponse<Data>> {
|
|
119
|
+
select<S extends string = '*'>(columns?: S & ValidateSelect<Row, S>, options?: SelectOptions): TypedQuery<Row, Insert, Update, SelectResult<Row, S>>;
|
|
120
|
+
insert(values: Insert | readonly Insert[], options?: InsertOptions): TypedQuery<Row, Insert, Update, Result, null>;
|
|
121
|
+
upsert(values: Insert | readonly Insert[], options?: UpsertOptions): TypedQuery<Row, Insert, Update, Result, null>;
|
|
122
|
+
update(values: Update, options?: MutateOptions): TypedQuery<Row, Insert, Update, Result, null>;
|
|
123
|
+
delete(options?: MutateOptions): TypedQuery<Row, Insert, Update, Result, null>;
|
|
124
|
+
eq(column: ColumnName<Row>, value: FilterValue): this;
|
|
125
|
+
neq(column: ColumnName<Row>, value: FilterValue): this;
|
|
126
|
+
gt(column: ColumnName<Row>, value: FilterValue): this;
|
|
127
|
+
gte(column: ColumnName<Row>, value: FilterValue): this;
|
|
128
|
+
lt(column: ColumnName<Row>, value: FilterValue): this;
|
|
129
|
+
lte(column: ColumnName<Row>, value: FilterValue): this;
|
|
130
|
+
like(column: ColumnName<Row>, pattern: string): this;
|
|
131
|
+
ilike(column: ColumnName<Row>, pattern: string): this;
|
|
132
|
+
likeAllOf(column: ColumnName<Row>, patterns: readonly string[]): this;
|
|
133
|
+
likeAnyOf(column: ColumnName<Row>, patterns: readonly string[]): this;
|
|
134
|
+
ilikeAllOf(column: ColumnName<Row>, patterns: readonly string[]): this;
|
|
135
|
+
ilikeAnyOf(column: ColumnName<Row>, patterns: readonly string[]): this;
|
|
136
|
+
in(column: ColumnName<Row>, values: readonly FilterValue[]): this;
|
|
137
|
+
is(column: ColumnName<Row>, value: PostgrestIsValue): this;
|
|
138
|
+
match(query: Partial<Record<ColumnName<Row>, FilterValue>>): this;
|
|
139
|
+
/** Escape hatches: the column is a free string so json paths (`data->>k`) work. */
|
|
140
|
+
not(column: string, operator: PostgrestFilterOperator | (string & {}), value: FilterValue | readonly FilterValue[]): this;
|
|
141
|
+
filter(column: string, operator: PostgrestFilterOperator | (string & {}), value: FilterValue | readonly FilterValue[]): this;
|
|
142
|
+
or(filters: string, options?: ReferencedTableOption): this;
|
|
143
|
+
textSearch(column: ColumnName<Row>, query: string, options?: {
|
|
144
|
+
type?: TextSearchType;
|
|
145
|
+
config?: string;
|
|
146
|
+
}): this;
|
|
147
|
+
contains(column: ColumnName<Row>, value: PostgrestArrayOperand): this;
|
|
148
|
+
containedBy(column: ColumnName<Row>, value: PostgrestArrayOperand): this;
|
|
149
|
+
overlaps(column: ColumnName<Row>, value: PostgrestArrayOperand): this;
|
|
150
|
+
rangeGt(column: ColumnName<Row>, range: string): this;
|
|
151
|
+
rangeGte(column: ColumnName<Row>, range: string): this;
|
|
152
|
+
rangeLt(column: ColumnName<Row>, range: string): this;
|
|
153
|
+
rangeLte(column: ColumnName<Row>, range: string): this;
|
|
154
|
+
rangeAdjacent(column: ColumnName<Row>, range: string): this;
|
|
155
|
+
order(column: ColumnName<Row>, options?: OrderOptions): this;
|
|
156
|
+
limit(count: number, options?: ReferencedTableOption): this;
|
|
157
|
+
range(from: number, to: number, options?: ReferencedTableOption): this;
|
|
158
|
+
abortSignal(signal: AbortSignal): this;
|
|
159
|
+
/** Send one more header with this request only, e.g. `x-captcha-response`. */
|
|
160
|
+
setHeader(name: string, value: string): this;
|
|
161
|
+
/** Re-type the rows: for shapes the generated `Database` cannot express. */
|
|
162
|
+
returns<T>(): TypedQuery<Row, Insert, Update, T, RowsUnlessWrite<Data, T[]>>;
|
|
163
|
+
overrideTypes<T>(): TypedQuery<Row, Insert, Update, T, RowsUnlessWrite<Data, T[]>>;
|
|
164
|
+
/** Reject instead of resolving `{ data: null, error }`. */
|
|
165
|
+
throwOnError(): this;
|
|
166
|
+
/** Refuse the write if it would touch more than `count` rows. */
|
|
167
|
+
maxAffected(count: number): this;
|
|
168
|
+
/** Run the query, then roll the transaction back. */
|
|
169
|
+
rollback(): this;
|
|
170
|
+
csv(): PostgrestTextBuilder;
|
|
171
|
+
geojson(): PostgrestExplainBuilder;
|
|
172
|
+
explain(options?: ExplainOptions): PostgrestExplainBuilder;
|
|
173
|
+
/**
|
|
174
|
+
* Walk every matching row instead of stopping at the server's row cap.
|
|
175
|
+
* Throws on error: a `for await` loop has nowhere to put an error value, and
|
|
176
|
+
* ending the iteration quietly looks exactly like reaching the last page.
|
|
177
|
+
*/
|
|
178
|
+
stream(options?: PaginateOptions): AsyncGenerator<Result, void, undefined>;
|
|
179
|
+
paginate(options?: PaginateOptions): AsyncGenerator<{
|
|
180
|
+
rows: Result[];
|
|
181
|
+
from: number;
|
|
182
|
+
count: number | null;
|
|
183
|
+
}, void, undefined>;
|
|
184
|
+
single(): TypedSingleQuery<RowsUnlessWrite<Data, Result>>;
|
|
185
|
+
maybeSingle(): TypedSingleQuery<RowsUnlessWrite<Data, Result | null>>;
|
|
186
|
+
/** The URL path (with query string) this builder targets. Exposed for tests. */
|
|
187
|
+
toPath(): string;
|
|
188
|
+
/** The headers this builder sends (Prefer, Accept). Exposed for tests. */
|
|
189
|
+
toHeaders(): Record<string, string>;
|
|
190
|
+
}
|
|
191
|
+
/** A builder narrowed to one row by `.single()` / `.maybeSingle()`. */
|
|
192
|
+
export interface TypedSingleQuery<Result> extends PromiseLike<PostgrestResponse<Result>> {
|
|
193
|
+
toPath(): string;
|
|
194
|
+
toHeaders(): Record<string, string>;
|
|
195
|
+
}
|
|
196
|
+
export {};
|
|
197
|
+
//# sourceMappingURL=database.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/database/database.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database.js","sourceRoot":"","sources":["../../src/database/database.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prisma-shaped access to a table, as an alternative to `client.from()`:
|
|
3
|
+
*
|
|
4
|
+
* ```ts
|
|
5
|
+
* const posts = await client.db.posts.findMany({
|
|
6
|
+
* where: { published: true, views: { gt: 100 } },
|
|
7
|
+
* select: { id: true, title: true },
|
|
8
|
+
* orderBy: { created_at: 'desc' },
|
|
9
|
+
* take: 20,
|
|
10
|
+
* })
|
|
11
|
+
* ```
|
|
12
|
+
*
|
|
13
|
+
* A second syntax, not a second query engine. Each method translates its
|
|
14
|
+
* arguments into calls on the same `PostgrestQueryBuilder` that `from()`
|
|
15
|
+
* returns (`where: { views: { gt: 100 } }` becomes `.gt('views', 100)`), so
|
|
16
|
+
* both send identical requests. What the facade cannot express (embedded
|
|
17
|
+
* relations, `or`, json paths) stays one `client.from()` away.
|
|
18
|
+
*
|
|
19
|
+
* Failures throw, as in Prisma. A facade resolving `{ data, error }` would
|
|
20
|
+
* differ from `from()` in argument shape only.
|
|
21
|
+
*/
|
|
22
|
+
import type { PostgrestQueryBuilder } from '../postgrest/query-builder.js';
|
|
23
|
+
import type { GenericSchema, InsertOf, RelationName, RowOf, UpdateOf } from './types.js';
|
|
24
|
+
/** The conditions one column can take in a `where`. Several on one column are ANDed. */
|
|
25
|
+
export interface WhereOperators<Value> {
|
|
26
|
+
/** Equal to the value. `null` matches NULL. */
|
|
27
|
+
equals?: Value | null;
|
|
28
|
+
/** Different from the value. `null` matches every non-NULL value. */
|
|
29
|
+
not?: Value | null;
|
|
30
|
+
/** Equal to one of the values. */
|
|
31
|
+
in?: readonly Value[];
|
|
32
|
+
/** Greater than. */
|
|
33
|
+
gt?: Value;
|
|
34
|
+
/** Greater than or equal. */
|
|
35
|
+
gte?: Value;
|
|
36
|
+
/** Less than. */
|
|
37
|
+
lt?: Value;
|
|
38
|
+
/** Less than or equal. */
|
|
39
|
+
lte?: Value;
|
|
40
|
+
/** Text containing this string, case-sensitive. */
|
|
41
|
+
contains?: string;
|
|
42
|
+
/** Text starting with this string, case-sensitive. */
|
|
43
|
+
startsWith?: string;
|
|
44
|
+
/** Text ending with this string, case-sensitive. */
|
|
45
|
+
endsWith?: string;
|
|
46
|
+
}
|
|
47
|
+
/** Per column, a bare value (meaning `equals`) or operators. Columns are ANDed. */
|
|
48
|
+
export type Where<Row> = {
|
|
49
|
+
[Column in keyof Row]?: Row[Column] | WhereOperators<Row[Column]>;
|
|
50
|
+
};
|
|
51
|
+
/** The columns to read: `{ id: true, title: true }`. Omitted, every column is read. */
|
|
52
|
+
export type SelectColumns<Row> = {
|
|
53
|
+
[Column in keyof Row]?: true;
|
|
54
|
+
};
|
|
55
|
+
/** Sort order per column, applied in key order: `{ created_at: 'desc', id: 'asc' }`. */
|
|
56
|
+
export type OrderBy<Row> = {
|
|
57
|
+
[Column in keyof Row]?: 'asc' | 'desc';
|
|
58
|
+
};
|
|
59
|
+
/** What `findMany()` and `findFirst()` accept. Every field is optional. */
|
|
60
|
+
export interface FindManyArgs<Row, Select extends SelectColumns<Row> | undefined = undefined> {
|
|
61
|
+
/** Which rows: `{ published: true, views: { gt: 100 } }`. */
|
|
62
|
+
where?: Where<Row>;
|
|
63
|
+
/** Which columns: `{ id: true, title: true }`. The result type narrows to them. */
|
|
64
|
+
select?: Select;
|
|
65
|
+
/** Sort order: `{ created_at: 'desc' }`. */
|
|
66
|
+
orderBy?: OrderBy<Row>;
|
|
67
|
+
/** Return at most this many rows. */
|
|
68
|
+
take?: number;
|
|
69
|
+
/** Skip this many rows first. Needs `take`. */
|
|
70
|
+
skip?: number;
|
|
71
|
+
}
|
|
72
|
+
/** `select: { id: true }` narrows each result to `Pick<Row, 'id'>`; no select is the whole row. */
|
|
73
|
+
export type Selected<Row, Select> = Select extends SelectColumns<Row> ? Pick<Row, Extract<keyof Select, keyof Row>> : Row;
|
|
74
|
+
/**
|
|
75
|
+
* One table, Prisma-style: what `client.db.<table>` returns. Every method
|
|
76
|
+
* throws on failure.
|
|
77
|
+
*/
|
|
78
|
+
export interface TableFacade<Row, Insert, Update> {
|
|
79
|
+
/**
|
|
80
|
+
* Read every row matching `where`.
|
|
81
|
+
* @example await client.db.posts.findMany({ where: { published: true }, orderBy: { created_at: 'desc' }, take: 20 })
|
|
82
|
+
*/
|
|
83
|
+
findMany<Select extends SelectColumns<Row> | undefined = undefined>(args?: FindManyArgs<Row, Select>): Promise<Selected<Row, Select>[]>;
|
|
84
|
+
/**
|
|
85
|
+
* Read the first row matching `where`, or `null` when none does.
|
|
86
|
+
* @example await client.db.posts.findFirst({ where: { slug } })
|
|
87
|
+
*/
|
|
88
|
+
findFirst<Select extends SelectColumns<Row> | undefined = undefined>(args?: Omit<FindManyArgs<Row, Select>, 'take'>): Promise<Selected<Row, Select> | null>;
|
|
89
|
+
/**
|
|
90
|
+
* Insert one row and resolve it as stored, defaults and generated ids included.
|
|
91
|
+
* @example const post = await client.db.posts.create({ data: { title } })
|
|
92
|
+
*/
|
|
93
|
+
create(args: {
|
|
94
|
+
data: Insert;
|
|
95
|
+
}): Promise<Row>;
|
|
96
|
+
/**
|
|
97
|
+
* Update every row matching `where` and resolve the updated rows (Prisma
|
|
98
|
+
* resolves `{ count }`). Throws if `where` matches no column, so an id that
|
|
99
|
+
* is `undefined` at runtime cannot update the whole table.
|
|
100
|
+
* @example await client.db.posts.updateMany({ where: { id }, data: { title } })
|
|
101
|
+
*/
|
|
102
|
+
updateMany(args: {
|
|
103
|
+
where: Where<Row>;
|
|
104
|
+
data: Update;
|
|
105
|
+
}): Promise<Row[]>;
|
|
106
|
+
/**
|
|
107
|
+
* Delete every row matching `where` and resolve the deleted rows. Throws if
|
|
108
|
+
* `where` matches no column, so an id that is `undefined` at runtime cannot
|
|
109
|
+
* empty the table.
|
|
110
|
+
* @example await client.db.posts.deleteMany({ where: { id } })
|
|
111
|
+
*/
|
|
112
|
+
deleteMany(args: {
|
|
113
|
+
where: Where<Row>;
|
|
114
|
+
}): Promise<Row[]>;
|
|
115
|
+
}
|
|
116
|
+
/** `client.db`: one `TableFacade` per table or view of the generated `Database`. */
|
|
117
|
+
export type DatabaseFacade<Schema extends GenericSchema> = {
|
|
118
|
+
[Name in RelationName<Schema>]: TableFacade<RowOf<Schema, Name>, InsertOf<Schema, Name>, UpdateOf<Schema, Name>>;
|
|
119
|
+
};
|
|
120
|
+
type Builder = PostgrestQueryBuilder<any>;
|
|
121
|
+
type Operator = keyof WhereOperators<unknown>;
|
|
122
|
+
interface Filter {
|
|
123
|
+
column: string;
|
|
124
|
+
operator: Operator;
|
|
125
|
+
value: unknown;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Flatten a `where` into one filter per condition:
|
|
129
|
+
* `{ published: true, views: { gt: 1, lt: 9 } }` is three filters.
|
|
130
|
+
*
|
|
131
|
+
* An `undefined` value means "no filter", as in Prisma, so `{ author_id: maybeId }`
|
|
132
|
+
* reads naturally. `requireFilters` is what stops that from widening a write.
|
|
133
|
+
*/
|
|
134
|
+
export declare function filtersOf(where?: object): Filter[];
|
|
135
|
+
/** The read half: `findMany` arguments applied to a fresh builder. Exported for tests. */
|
|
136
|
+
export declare function applyFindArgs(query: Builder, args?: FindManyArgs<any, any>): Builder;
|
|
137
|
+
/**
|
|
138
|
+
* One table's facade. `newQuery` returns a fresh builder for that table on
|
|
139
|
+
* every call. Every method is `async`, so a refused write rejects like a failed
|
|
140
|
+
* one instead of throwing synchronously.
|
|
141
|
+
*/
|
|
142
|
+
export declare function tableFacade<Row, Insert, Update>(newQuery: () => Builder): TableFacade<Row, Insert, Update>;
|
|
143
|
+
export {};
|
|
144
|
+
//# sourceMappingURL=facade.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"facade.d.ts","sourceRoot":"","sources":["../../src/database/facade.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
const OPERATORS = new Set([
|
|
2
|
+
'equals', 'not', 'in', 'gt', 'gte', 'lt', 'lte', 'contains', 'startsWith', 'endsWith',
|
|
3
|
+
]);
|
|
4
|
+
/**
|
|
5
|
+
* An operator object, as opposed to a bare value. Every key must be an
|
|
6
|
+
* operator, so a json column compared to `{ theme: 'dark' }` stays a value.
|
|
7
|
+
*/
|
|
8
|
+
function isOperators(condition) {
|
|
9
|
+
if (typeof condition !== 'object' || condition === null || Array.isArray(condition))
|
|
10
|
+
return false;
|
|
11
|
+
const keys = Object.keys(condition);
|
|
12
|
+
return keys.length > 0 && keys.every(key => OPERATORS.has(key));
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Flatten a `where` into one filter per condition:
|
|
16
|
+
* `{ published: true, views: { gt: 1, lt: 9 } }` is three filters.
|
|
17
|
+
*
|
|
18
|
+
* An `undefined` value means "no filter", as in Prisma, so `{ author_id: maybeId }`
|
|
19
|
+
* reads naturally. `requireFilters` is what stops that from widening a write.
|
|
20
|
+
*/
|
|
21
|
+
export function filtersOf(where = {}) {
|
|
22
|
+
const filters = [];
|
|
23
|
+
for (const [column, condition] of Object.entries(where)) {
|
|
24
|
+
if (isOperators(condition)) {
|
|
25
|
+
for (const [operator, value] of Object.entries(condition)) {
|
|
26
|
+
filters.push({ column, operator: operator, value });
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
filters.push({ column, operator: 'equals', value: condition });
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return filters.filter(filter => filter.value !== undefined);
|
|
34
|
+
}
|
|
35
|
+
function applyFilter(query, { column, operator, value }) {
|
|
36
|
+
const v = value;
|
|
37
|
+
switch (operator) {
|
|
38
|
+
// SQL's `= NULL` matches nothing: a null comparison has to be `IS NULL`.
|
|
39
|
+
case 'equals':
|
|
40
|
+
if (value === null)
|
|
41
|
+
query.is(column, null);
|
|
42
|
+
else
|
|
43
|
+
query.eq(column, v);
|
|
44
|
+
return;
|
|
45
|
+
case 'not':
|
|
46
|
+
if (value === null)
|
|
47
|
+
query.not(column, 'is', null);
|
|
48
|
+
else
|
|
49
|
+
query.neq(column, v);
|
|
50
|
+
return;
|
|
51
|
+
case 'in':
|
|
52
|
+
query.in(column, v);
|
|
53
|
+
return;
|
|
54
|
+
case 'gt':
|
|
55
|
+
query.gt(column, v);
|
|
56
|
+
return;
|
|
57
|
+
case 'gte':
|
|
58
|
+
query.gte(column, v);
|
|
59
|
+
return;
|
|
60
|
+
case 'lt':
|
|
61
|
+
query.lt(column, v);
|
|
62
|
+
return;
|
|
63
|
+
case 'lte':
|
|
64
|
+
query.lte(column, v);
|
|
65
|
+
return;
|
|
66
|
+
// `*` is PostgREST's LIKE wildcard.
|
|
67
|
+
// ponytail: a `*` inside the value is a wildcard too; escape it if literal stars need matching.
|
|
68
|
+
case 'contains':
|
|
69
|
+
query.like(column, `*${v}*`);
|
|
70
|
+
return;
|
|
71
|
+
case 'startsWith':
|
|
72
|
+
query.like(column, `${v}*`);
|
|
73
|
+
return;
|
|
74
|
+
case 'endsWith':
|
|
75
|
+
query.like(column, `*${v}`);
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* A write with no filter touches every row. Prisma allows it; here it takes
|
|
81
|
+
* `client.from(table)` written out, so an id that was `undefined` at runtime
|
|
82
|
+
* cannot turn a targeted delete into a table wipe.
|
|
83
|
+
*/
|
|
84
|
+
function requireFilters(where, method) {
|
|
85
|
+
const filters = filtersOf(where);
|
|
86
|
+
if (!filters.length) {
|
|
87
|
+
throw new Error(`${method}(): where matched no column. Use client.from(table) to write every row.`);
|
|
88
|
+
}
|
|
89
|
+
return filters;
|
|
90
|
+
}
|
|
91
|
+
/** The read half: `findMany` arguments applied to a fresh builder. Exported for tests. */
|
|
92
|
+
export function applyFindArgs(query, args = {}) {
|
|
93
|
+
query.select(args.select ? Object.keys(args.select).join(',') : '*');
|
|
94
|
+
for (const filter of filtersOf(args.where))
|
|
95
|
+
applyFilter(query, filter);
|
|
96
|
+
for (const [column, direction] of Object.entries(args.orderBy ?? {})) {
|
|
97
|
+
query.order(column, { ascending: direction === 'asc' });
|
|
98
|
+
}
|
|
99
|
+
if (args.take !== undefined) {
|
|
100
|
+
const skip = args.skip ?? 0;
|
|
101
|
+
query.range(skip, skip + args.take - 1);
|
|
102
|
+
}
|
|
103
|
+
else if (args.skip !== undefined) {
|
|
104
|
+
throw new Error('findMany(): skip needs take, the builder only offsets through range().');
|
|
105
|
+
}
|
|
106
|
+
return query;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* `data` of a query sent with `throwOnError()`. Such a query only resolves on
|
|
110
|
+
* success, so `data` is set, whatever the `{ data, error }` envelope type says.
|
|
111
|
+
*/
|
|
112
|
+
async function dataOf(query) {
|
|
113
|
+
return (await query).data;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* One table's facade. `newQuery` returns a fresh builder for that table on
|
|
117
|
+
* every call. Every method is `async`, so a refused write rejects like a failed
|
|
118
|
+
* one instead of throwing synchronously.
|
|
119
|
+
*/
|
|
120
|
+
export function tableFacade(newQuery) {
|
|
121
|
+
return {
|
|
122
|
+
async findMany(args) {
|
|
123
|
+
return dataOf(applyFindArgs(newQuery(), args).throwOnError());
|
|
124
|
+
},
|
|
125
|
+
async findFirst(args) {
|
|
126
|
+
return dataOf(applyFindArgs(newQuery(), { ...args, take: 1 }).throwOnError().maybeSingle());
|
|
127
|
+
},
|
|
128
|
+
async create({ data }) {
|
|
129
|
+
return dataOf(newQuery().insert(data).select().throwOnError().single());
|
|
130
|
+
},
|
|
131
|
+
async updateMany({ where, data }) {
|
|
132
|
+
const filters = requireFilters(where, 'updateMany');
|
|
133
|
+
const query = newQuery().update(data);
|
|
134
|
+
for (const filter of filters)
|
|
135
|
+
applyFilter(query, filter);
|
|
136
|
+
return dataOf(query.select().throwOnError());
|
|
137
|
+
},
|
|
138
|
+
async deleteMany({ where }) {
|
|
139
|
+
const filters = requireFilters(where, 'deleteMany');
|
|
140
|
+
const query = newQuery().delete();
|
|
141
|
+
for (const filter of filters)
|
|
142
|
+
applyFilter(query, filter);
|
|
143
|
+
return dataOf(query.select().throwOnError());
|
|
144
|
+
},
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=facade.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"facade.js","sourceRoot":"","sources":["../../src/database/facade.ts"],"names":[],"mappings":"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"}
|