@motherbase/client 1.5.0 → 1.5.2

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.
Files changed (94) hide show
  1. package/README.md +25 -1
  2. package/dist/admin.d.ts +131 -0
  3. package/dist/admin.d.ts.map +1 -0
  4. package/dist/admin.js +121 -0
  5. package/dist/admin.js.map +1 -0
  6. package/dist/auth.d.ts +463 -0
  7. package/dist/auth.d.ts.map +1 -0
  8. package/dist/auth.js +884 -0
  9. package/dist/auth.js.map +1 -0
  10. package/dist/channel.d.ts +129 -0
  11. package/dist/channel.d.ts.map +1 -0
  12. package/dist/channel.js +215 -0
  13. package/dist/channel.js.map +1 -0
  14. package/dist/compat.d.ts +40 -0
  15. package/dist/compat.d.ts.map +1 -0
  16. package/dist/compat.js +100 -0
  17. package/dist/compat.js.map +1 -0
  18. package/dist/cookie.d.ts +68 -0
  19. package/dist/cookie.d.ts.map +1 -0
  20. package/dist/cookie.js +152 -0
  21. package/dist/cookie.js.map +1 -0
  22. package/dist/database.d.ts +188 -0
  23. package/dist/database.d.ts.map +1 -0
  24. package/dist/database.js +2 -0
  25. package/dist/database.js.map +1 -0
  26. package/dist/functions.d.ts +60 -0
  27. package/dist/functions.d.ts.map +1 -0
  28. package/dist/functions.js +75 -0
  29. package/dist/functions.js.map +1 -0
  30. package/dist/http.d.ts +122 -0
  31. package/dist/http.d.ts.map +1 -0
  32. package/dist/http.js +206 -0
  33. package/dist/http.js.map +1 -0
  34. package/dist/index.d.ts +215 -0
  35. package/dist/index.d.ts.map +1 -0
  36. package/dist/index.js +365 -0
  37. package/dist/index.js.map +1 -0
  38. package/dist/mfa.d.ts +126 -0
  39. package/dist/mfa.d.ts.map +1 -0
  40. package/dist/mfa.js +167 -0
  41. package/dist/mfa.js.map +1 -0
  42. package/dist/organization.d.ts +234 -0
  43. package/dist/organization.d.ts.map +1 -0
  44. package/dist/organization.js +157 -0
  45. package/dist/organization.js.map +1 -0
  46. package/dist/passkey.d.ts +59 -0
  47. package/dist/passkey.d.ts.map +1 -0
  48. package/dist/passkey.js +87 -0
  49. package/dist/passkey.js.map +1 -0
  50. package/dist/pkce.d.ts +13 -0
  51. package/dist/pkce.d.ts.map +1 -0
  52. package/dist/pkce.js +52 -0
  53. package/dist/pkce.js.map +1 -0
  54. package/dist/plugin-endpoint.d.ts +20 -0
  55. package/dist/plugin-endpoint.d.ts.map +1 -0
  56. package/dist/plugin-endpoint.js +24 -0
  57. package/dist/plugin-endpoint.js.map +1 -0
  58. package/dist/postgrest.d.ts +326 -0
  59. package/dist/postgrest.d.ts.map +1 -0
  60. package/dist/postgrest.js +625 -0
  61. package/dist/postgrest.js.map +1 -0
  62. package/dist/query.d.ts +97 -0
  63. package/dist/query.d.ts.map +1 -0
  64. package/dist/query.js +94 -0
  65. package/dist/query.js.map +1 -0
  66. package/dist/realtime.d.ts +114 -0
  67. package/dist/realtime.d.ts.map +1 -0
  68. package/dist/realtime.js +376 -0
  69. package/dist/realtime.js.map +1 -0
  70. package/dist/session.d.ts +47 -0
  71. package/dist/session.d.ts.map +1 -0
  72. package/dist/session.js +136 -0
  73. package/dist/session.js.map +1 -0
  74. package/dist/sso.d.ts +147 -0
  75. package/dist/sso.d.ts.map +1 -0
  76. package/dist/sso.js +35 -0
  77. package/dist/sso.js.map +1 -0
  78. package/dist/storage.d.ts +268 -0
  79. package/dist/storage.d.ts.map +1 -0
  80. package/dist/storage.js +441 -0
  81. package/dist/storage.js.map +1 -0
  82. package/dist/testing.d.ts +38 -0
  83. package/dist/testing.d.ts.map +1 -0
  84. package/dist/testing.js +50 -0
  85. package/dist/testing.js.map +1 -0
  86. package/dist/types.d.ts +353 -0
  87. package/dist/types.d.ts.map +1 -0
  88. package/dist/types.js +2 -0
  89. package/dist/types.js.map +1 -0
  90. package/dist/warn.d.ts +2 -0
  91. package/dist/warn.d.ts.map +1 -0
  92. package/dist/warn.js +23 -0
  93. package/dist/warn.js.map +1 -0
  94. package/package.json +4 -2
package/README.md CHANGED
@@ -285,7 +285,31 @@ upload.findPreviousUploads().then(previous => {
285
285
  });
286
286
  ```
287
287
 
288
- ## Social sign-in (OAuth)
288
+ ## Password sign-in with MFA
289
+
290
+ When the account requires a second factor, password sign-in returns
291
+ `twoFactorRequired: true` and the available `twoFactorMethods`. It does not
292
+ create a local session until verification succeeds.
293
+
294
+ ```ts
295
+ const { data, error } = await client.auth.signInWithPassword({ email, password });
296
+ if (error) throw new Error(error.message);
297
+
298
+ if (data?.twoFactorRequired) {
299
+ // Show a code field. For an email/SMS OTP, call mfa.challenge({ channel }) first.
300
+ const { error: verifyError } = await client.auth.mfa.verify({ code });
301
+ if (verifyError) throw new Error(verifyError.message);
302
+ }
303
+
304
+ // The verified session is now available through client.auth.getSession().
305
+ ```
306
+
307
+ The SDK includes the challenge cookie on sign-in and verification requests.
308
+ The project's CORS and cookie settings must allow the app's origin when the
309
+ app and API are on different sites. A UI toggle cannot bypass a second factor
310
+ required by the server.
311
+
312
+ ## Social sign-in (OAuth)
289
313
 
290
314
  A provider callback is a browser redirect, so it cannot answer the SDK with a
291
315
  session the way a password sign-in does. Two calls, not one:
@@ -0,0 +1,131 @@
1
+ import type { HttpClient } from './http.js';
2
+ import type { MotherbaseResponse, User } from './types.js';
3
+ /**
4
+ * `client.auth.admin`, shaped like `supabase.auth.admin`.
5
+ *
6
+ * Every method here needs a **secret** project API key, so the client it hangs
7
+ * off must have been built with one. A publishable key gets a 401 from the
8
+ * server, which is the correct outcome: these calls create and delete users
9
+ * without being any user.
10
+ *
11
+ * Two differences from supabase-js worth knowing before you port code:
12
+ *
13
+ * * Scope. This is user administration only. Supabase's service key also opens
14
+ * SQL and DDL; here those stay behind operator authentication, so a leaked
15
+ * application key cannot drop a table.
16
+ * * `generateLink` covers signup, invite, magiclink and recovery. Recovery is
17
+ * code-based here, so it returns `email_otp` and no `action_link`, and the
18
+ * `email_change_*` types are refused.
19
+ */
20
+ export interface AdminListUsersParams {
21
+ page?: number;
22
+ perPage?: number;
23
+ }
24
+ export interface AdminUserList {
25
+ users: User[];
26
+ page: number;
27
+ perPage: number;
28
+ total: number;
29
+ }
30
+ export interface AdminCreateUserParams {
31
+ email: string;
32
+ password?: string;
33
+ username?: string;
34
+ role?: 'ADMIN' | 'USER';
35
+ /** Mark the address verified without sending a confirmation. */
36
+ email_confirm?: boolean;
37
+ /** Also email the temporary password. `invite()` is the same thing, named. */
38
+ sendInvite?: boolean;
39
+ }
40
+ export interface AdminCreatedUser {
41
+ user: User;
42
+ /** Generated when no password was supplied. Never logged by the SDK. */
43
+ temporaryPassword: string;
44
+ invited: boolean;
45
+ }
46
+ export interface AdminUpdateUserParams {
47
+ password?: string;
48
+ role?: 'ADMIN' | 'USER';
49
+ username?: string;
50
+ firstName?: string;
51
+ lastName?: string;
52
+ status?: string;
53
+ }
54
+ export interface AdminGenerateLinkParams {
55
+ type: 'signup' | 'invite' | 'magiclink' | 'recovery' | 'email_change_current' | 'email_change_new';
56
+ email: string;
57
+ /** Required for `signup`. */
58
+ password?: string;
59
+ newEmail?: string;
60
+ options?: {
61
+ redirectTo?: string;
62
+ data?: Record<string, unknown>;
63
+ };
64
+ }
65
+ export interface AdminGeneratedLink {
66
+ properties: {
67
+ /** The link the email would carry. Null for `recovery`, which is code-based here. */
68
+ action_link: string | null;
69
+ email_otp: string | null;
70
+ hashed_token: string | null;
71
+ redirect_to: string | null;
72
+ verification_type: string;
73
+ };
74
+ user: User | null;
75
+ }
76
+ /** A supabase-js `Factor`: TOTP from two-factor, and each passkey as `webauthn`. */
77
+ export interface AdminMfaFactor {
78
+ id: string;
79
+ factor_type: 'totp' | 'webauthn';
80
+ status: 'verified' | 'unverified';
81
+ friendly_name: string;
82
+ created_at: string | null;
83
+ updated_at: string | null;
84
+ }
85
+ /** `auth.admin.mfa`, shaped like supabase-js. */
86
+ export declare class AuthAdminMfaClient {
87
+ private readonly http;
88
+ constructor(http: HttpClient);
89
+ listFactors(params: {
90
+ userId: string;
91
+ }): Promise<MotherbaseResponse<{
92
+ factors: AdminMfaFactor[];
93
+ }>>;
94
+ deleteFactor(params: {
95
+ userId: string;
96
+ id: string;
97
+ }): Promise<MotherbaseResponse<{
98
+ id: string;
99
+ }>>;
100
+ }
101
+ export declare class AuthAdminClient {
102
+ private readonly http;
103
+ readonly mfa: AuthAdminMfaClient;
104
+ constructor(http: HttpClient);
105
+ /** The link (or code) an auth email would carry, returned instead of sent. */
106
+ generateLink(params: AdminGenerateLinkParams): Promise<MotherbaseResponse<AdminGeneratedLink>>;
107
+ listUsers(params?: AdminListUsersParams): Promise<MotherbaseResponse<AdminUserList>>;
108
+ getUserById(id: string): Promise<MotherbaseResponse<{
109
+ user: User | null;
110
+ }>>;
111
+ createUser(params: AdminCreateUserParams): Promise<MotherbaseResponse<AdminCreatedUser>>;
112
+ updateUserById(id: string, params: AdminUpdateUserParams): Promise<MotherbaseResponse<{
113
+ user: User | null;
114
+ }>>;
115
+ deleteUser(id: string): Promise<MotherbaseResponse<{
116
+ id: string;
117
+ }>>;
118
+ /** End every session this user holds, everywhere. */
119
+ signOut(userId: string): Promise<MotherbaseResponse<{
120
+ id: string;
121
+ }>>;
122
+ /** Create the account and email the temporary password to it. */
123
+ inviteUserByEmail(email: string, options?: {
124
+ username?: string;
125
+ role?: 'ADMIN' | 'USER';
126
+ }): Promise<MotherbaseResponse<{
127
+ user: User;
128
+ invited: boolean;
129
+ }>>;
130
+ }
131
+ //# sourceMappingURL=admin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin.d.ts","sourceRoot":"","sources":["../src/admin.ts"],"names":[],"mappings":"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"}
package/dist/admin.js ADDED
@@ -0,0 +1,121 @@
1
+ import { toError } from './http.js';
2
+ import { HTTP_ROUTES } from '@motherbase/contracts';
3
+ const BASE = HTTP_ROUTES.authAdmin;
4
+ /** `auth.admin.mfa`, shaped like supabase-js. */
5
+ export class AuthAdminMfaClient {
6
+ constructor(http) {
7
+ this.http = http;
8
+ }
9
+ async listFactors(params) {
10
+ try {
11
+ const data = await this.http.request(`${BASE}/users/${encodeURIComponent(params.userId)}/factors`);
12
+ return { data, error: null };
13
+ }
14
+ catch (err) {
15
+ return { data: null, error: toError(err) };
16
+ }
17
+ }
18
+ async deleteFactor(params) {
19
+ try {
20
+ const data = await this.http.request(`${BASE}/users/${encodeURIComponent(params.userId)}/factors/${encodeURIComponent(params.id)}`, { method: 'DELETE' });
21
+ return { data, error: null };
22
+ }
23
+ catch (err) {
24
+ return { data: null, error: toError(err) };
25
+ }
26
+ }
27
+ }
28
+ export class AuthAdminClient {
29
+ constructor(http) {
30
+ this.http = http;
31
+ this.mfa = new AuthAdminMfaClient(http);
32
+ }
33
+ /** The link (or code) an auth email would carry, returned instead of sent. */
34
+ async generateLink(params) {
35
+ try {
36
+ const data = await this.http.request(`${BASE}/generate-link`, { method: 'POST', body: params });
37
+ return { data, error: null };
38
+ }
39
+ catch (err) {
40
+ return { data: null, error: toError(err) };
41
+ }
42
+ }
43
+ async listUsers(params = {}) {
44
+ const query = new URLSearchParams();
45
+ if (params.page !== undefined)
46
+ query.set('page', String(params.page));
47
+ if (params.perPage !== undefined)
48
+ query.set('per_page', String(params.perPage));
49
+ const suffix = query.toString();
50
+ try {
51
+ const data = await this.http.request(`${BASE}/users${suffix ? `?${suffix}` : ''}`);
52
+ return { data, error: null };
53
+ }
54
+ catch (err) {
55
+ return { data: null, error: toError(err) };
56
+ }
57
+ }
58
+ async getUserById(id) {
59
+ try {
60
+ const data = await this.http.request(`${BASE}/users/${encodeURIComponent(id)}`);
61
+ return { data, error: null };
62
+ }
63
+ catch (err) {
64
+ return { data: { user: null }, error: toError(err) };
65
+ }
66
+ }
67
+ async createUser(params) {
68
+ try {
69
+ const data = await this.http.request(`${BASE}/users`, { method: 'POST', body: params });
70
+ return { data, error: null };
71
+ }
72
+ catch (err) {
73
+ return { data: null, error: toError(err) };
74
+ }
75
+ }
76
+ async updateUserById(id, params) {
77
+ try {
78
+ const data = await this.http.request(`${BASE}/users/${encodeURIComponent(id)}`, {
79
+ method: 'PATCH',
80
+ body: params,
81
+ });
82
+ return { data, error: null };
83
+ }
84
+ catch (err) {
85
+ return { data: { user: null }, error: toError(err) };
86
+ }
87
+ }
88
+ async deleteUser(id) {
89
+ try {
90
+ await this.http.request(`${BASE}/users/${encodeURIComponent(id)}`, { method: 'DELETE' });
91
+ return { data: { id }, error: null };
92
+ }
93
+ catch (err) {
94
+ return { data: null, error: toError(err) };
95
+ }
96
+ }
97
+ /** End every session this user holds, everywhere. */
98
+ async signOut(userId) {
99
+ try {
100
+ await this.http.request(`${BASE}/users/${encodeURIComponent(userId)}/sign-out`, { method: 'POST' });
101
+ return { data: { id: userId }, error: null };
102
+ }
103
+ catch (err) {
104
+ return { data: null, error: toError(err) };
105
+ }
106
+ }
107
+ /** Create the account and email the temporary password to it. */
108
+ async inviteUserByEmail(email, options = {}) {
109
+ try {
110
+ const data = await this.http.request(`${BASE}/invite`, {
111
+ method: 'POST',
112
+ body: { email, ...options },
113
+ });
114
+ return { data, error: null };
115
+ }
116
+ catch (err) {
117
+ return { data: null, error: toError(err) };
118
+ }
119
+ }
120
+ }
121
+ //# sourceMappingURL=admin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin.js","sourceRoot":"","sources":["../src/admin.ts"],"names":[],"mappings":"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"}