@nexys/user-management-client 0.1.0 → 0.2.0
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/README.md +19 -0
- package/dist/endpoints/admin-users.d.ts +53 -23
- package/dist/endpoints/admin-users.d.ts.map +1 -1
- package/dist/endpoints/admin-users.js +56 -23
- package/dist/endpoints/admin-users.js.map +1 -1
- package/dist/endpoints/api-tokens.d.ts +23 -0
- package/dist/endpoints/api-tokens.d.ts.map +1 -0
- package/dist/endpoints/api-tokens.js +28 -0
- package/dist/endpoints/api-tokens.js.map +1 -0
- package/dist/endpoints/auth.d.ts +50 -7
- package/dist/endpoints/auth.d.ts.map +1 -1
- package/dist/endpoints/auth.js +33 -4
- package/dist/endpoints/auth.js.map +1 -1
- package/dist/endpoints/index.d.ts +4 -0
- package/dist/endpoints/index.d.ts.map +1 -1
- package/dist/endpoints/index.js +4 -0
- package/dist/endpoints/index.js.map +1 -1
- package/dist/endpoints/me.d.ts +14 -1
- package/dist/endpoints/me.d.ts.map +1 -1
- package/dist/endpoints/me.js +11 -0
- package/dist/endpoints/me.js.map +1 -1
- package/dist/endpoints/passkeys.d.ts +39 -0
- package/dist/endpoints/passkeys.d.ts.map +1 -0
- package/dist/endpoints/passkeys.js +53 -0
- package/dist/endpoints/passkeys.js.map +1 -0
- package/dist/endpoints/projects.d.ts +69 -0
- package/dist/endpoints/projects.d.ts.map +1 -0
- package/dist/endpoints/projects.js +73 -0
- package/dist/endpoints/projects.js.map +1 -0
- package/dist/endpoints/tenants.d.ts +72 -103
- package/dist/endpoints/tenants.d.ts.map +1 -1
- package/dist/endpoints/tenants.js +64 -82
- package/dist/endpoints/tenants.js.map +1 -1
- package/dist/endpoints/two-factor.d.ts +50 -0
- package/dist/endpoints/two-factor.d.ts.map +1 -0
- package/dist/endpoints/two-factor.js +64 -0
- package/dist/endpoints/two-factor.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +128 -44
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +7 -2
- package/src/endpoint.test.ts +158 -0
- package/src/endpoint.ts +123 -0
- package/src/endpoints/admin-audit.ts +60 -0
- package/src/endpoints/admin-keys.ts +37 -0
- package/src/endpoints/admin-users.ts +172 -0
- package/src/endpoints/api-tokens.ts +37 -0
- package/src/endpoints/auth.ts +203 -0
- package/src/endpoints/health.ts +50 -0
- package/src/endpoints/index.ts +12 -0
- package/src/endpoints/me.ts +79 -0
- package/src/endpoints/passkeys.ts +77 -0
- package/src/endpoints/projects.ts +117 -0
- package/src/endpoints/refresh-tokens.ts +25 -0
- package/src/endpoints/tenants.ts +313 -0
- package/src/endpoints/two-factor.ts +84 -0
- package/src/index.ts +26 -0
- package/src/result.ts +39 -0
- package/src/types.ts +285 -0
|
@@ -1,27 +1,37 @@
|
|
|
1
1
|
import { parseApiError } from "../result.js";
|
|
2
|
-
|
|
3
|
-
export const checkTenant = {
|
|
2
|
+
export const adminListTenants = {
|
|
4
3
|
method: "GET",
|
|
5
|
-
path: () => "/api/tenants
|
|
6
|
-
query: (input) => ({ name: input.name }),
|
|
4
|
+
path: () => "/api/admin/tenants",
|
|
7
5
|
parseOutput: (data) => data,
|
|
8
6
|
parseError: parseApiError,
|
|
9
7
|
};
|
|
10
|
-
export const
|
|
11
|
-
method: "
|
|
12
|
-
path: () => "/api/auth/organization/
|
|
8
|
+
export const createTenant = {
|
|
9
|
+
method: "POST",
|
|
10
|
+
path: () => "/api/auth/organization/create",
|
|
11
|
+
body: (input) => input,
|
|
13
12
|
parseOutput: (data) => data,
|
|
14
13
|
parseError: parseApiError,
|
|
15
14
|
};
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
15
|
+
/**
|
|
16
|
+
* Update tenant name/slug/logo and the per-tenant `metadata` settings
|
|
17
|
+
* blob. Omitted fields keep their current value; `metadata: null`
|
|
18
|
+
* clears the blob. Requires org owner/admin (or a superadmin).
|
|
19
|
+
*/
|
|
20
|
+
export const updateTenant = {
|
|
21
|
+
method: "POST",
|
|
22
|
+
path: () => "/api/auth/organization/update",
|
|
23
|
+
body: (input) => input,
|
|
19
24
|
parseOutput: (data) => data,
|
|
20
25
|
parseError: parseApiError,
|
|
21
26
|
};
|
|
22
|
-
|
|
27
|
+
/**
|
|
28
|
+
* Owner self-service tenant delete. Cascades members, invitations, and
|
|
29
|
+
* roles. Requires the caller to be the org owner (or a superadmin). For
|
|
30
|
+
* the superadmin system-wide path see {@link adminDeleteTenant}.
|
|
31
|
+
*/
|
|
32
|
+
export const deleteTenant = {
|
|
23
33
|
method: "POST",
|
|
24
|
-
path: () => "/api/auth/organization/
|
|
34
|
+
path: () => "/api/auth/organization/delete",
|
|
25
35
|
body: (input) => input,
|
|
26
36
|
parseOutput: (data) => data,
|
|
27
37
|
parseError: parseApiError,
|
|
@@ -61,6 +71,18 @@ export const updateMemberRole = {
|
|
|
61
71
|
parseOutput: () => ({ ok: true }),
|
|
62
72
|
parseError: parseApiError,
|
|
63
73
|
};
|
|
74
|
+
/**
|
|
75
|
+
* Direct member assignment — no invitation round-trip. The target
|
|
76
|
+
* user must already exist (lookup by userId or email); requires
|
|
77
|
+
* tenant owner/admin or a superadmin.
|
|
78
|
+
*/
|
|
79
|
+
export const addMember = {
|
|
80
|
+
method: "POST",
|
|
81
|
+
path: () => "/api/auth/organization/add-member",
|
|
82
|
+
body: (input) => input,
|
|
83
|
+
parseOutput: (data) => data,
|
|
84
|
+
parseError: parseApiError,
|
|
85
|
+
};
|
|
64
86
|
export const removeMember = {
|
|
65
87
|
method: "POST",
|
|
66
88
|
path: () => "/api/auth/organization/remove-member",
|
|
@@ -74,12 +96,6 @@ export const adminDeleteTenant = {
|
|
|
74
96
|
parseOutput: () => ({ ok: true }),
|
|
75
97
|
parseError: parseApiError,
|
|
76
98
|
};
|
|
77
|
-
export const deleteTenant = {
|
|
78
|
-
method: "DELETE",
|
|
79
|
-
path: (input) => `/api/tenants/${input.id}`,
|
|
80
|
-
parseOutput: () => ({ ok: true }),
|
|
81
|
-
parseError: parseApiError,
|
|
82
|
-
};
|
|
83
99
|
export const listTenantRoles = {
|
|
84
100
|
method: "GET",
|
|
85
101
|
path: (input) => `/api/tenants/${input.orgId}/roles`,
|
|
@@ -89,94 +105,60 @@ export const listTenantRoles = {
|
|
|
89
105
|
export const createTenantRole = {
|
|
90
106
|
method: "POST",
|
|
91
107
|
path: (input) => `/api/tenants/${input.orgId}/roles`,
|
|
92
|
-
body: (input) => ({
|
|
108
|
+
body: (input) => ({
|
|
109
|
+
name: input.name,
|
|
110
|
+
description: input.description,
|
|
111
|
+
permissions: input.permissions,
|
|
112
|
+
}),
|
|
93
113
|
parseOutput: (data) => data,
|
|
94
114
|
parseError: parseApiError,
|
|
95
115
|
};
|
|
96
|
-
|
|
97
|
-
|
|
116
|
+
/**
|
|
117
|
+
* Update a role's name/description and, when `permissions` is present,
|
|
118
|
+
* replace its permission set wholesale.
|
|
119
|
+
*/
|
|
120
|
+
export const updateTenantRole = {
|
|
121
|
+
method: "PATCH",
|
|
98
122
|
path: (input) => `/api/tenants/${input.orgId}/roles/${input.roleId}`,
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
path: (input) => `/api/tenants/${input.orgId}/members`,
|
|
105
|
-
body: (input) => ({ email: input.email, role: input.role ?? "member" }),
|
|
106
|
-
parseOutput: (data) => data,
|
|
107
|
-
parseError: parseApiError,
|
|
108
|
-
};
|
|
109
|
-
export const getTenantMember = {
|
|
110
|
-
method: "GET",
|
|
111
|
-
path: (input) => `/api/tenants/${input.orgId}/members/${input.userId}`,
|
|
112
|
-
parseOutput: (data) => data,
|
|
113
|
-
parseError: parseApiError,
|
|
114
|
-
};
|
|
115
|
-
export const getTenantMemberRoles = {
|
|
116
|
-
method: "GET",
|
|
117
|
-
path: (input) => `/api/tenants/${input.orgId}/members/${input.userId}/roles`,
|
|
118
|
-
parseOutput: (data) => data,
|
|
119
|
-
parseError: parseApiError,
|
|
120
|
-
};
|
|
121
|
-
export const getTenantMemberPermissions = {
|
|
122
|
-
method: "GET",
|
|
123
|
-
path: (input) => `/api/tenants/${input.orgId}/members/${input.userId}/permissions`,
|
|
124
|
-
parseOutput: (data) => data,
|
|
125
|
-
parseError: parseApiError,
|
|
126
|
-
};
|
|
127
|
-
export const getTenantMemberAuthMethods = {
|
|
128
|
-
method: "GET",
|
|
129
|
-
path: (input) => `/api/tenants/${input.orgId}/members/${input.userId}/auth-methods`,
|
|
123
|
+
body: (input) => ({
|
|
124
|
+
name: input.name,
|
|
125
|
+
description: input.description,
|
|
126
|
+
permissions: input.permissions,
|
|
127
|
+
}),
|
|
130
128
|
parseOutput: (data) => data,
|
|
131
129
|
parseError: parseApiError,
|
|
132
130
|
};
|
|
133
|
-
export const
|
|
134
|
-
method: "POST",
|
|
135
|
-
path: (input) => `/api/tenants/${input.orgId}/members/${input.userId}/roles`,
|
|
136
|
-
body: (input) => ({ roleId: input.roleId }),
|
|
137
|
-
parseOutput: () => ({ ok: true }),
|
|
138
|
-
parseError: parseApiError,
|
|
139
|
-
};
|
|
140
|
-
export const unassignTenantMemberRole = {
|
|
131
|
+
export const deleteTenantRole = {
|
|
141
132
|
method: "DELETE",
|
|
142
|
-
path: (input) => `/api/tenants/${input.orgId}/
|
|
133
|
+
path: (input) => `/api/tenants/${input.orgId}/roles/${input.roleId}`,
|
|
143
134
|
parseOutput: () => ({ ok: true }),
|
|
144
135
|
parseError: parseApiError,
|
|
145
136
|
};
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
137
|
+
/** Custom roles assigned to one member (with their permissions). */
|
|
138
|
+
export const listMemberRoles = {
|
|
139
|
+
method: "GET",
|
|
140
|
+
path: (input) => `/api/tenants/${input.orgId}/members/${input.memberId}/roles`,
|
|
150
141
|
parseOutput: (data) => data,
|
|
151
142
|
parseError: parseApiError,
|
|
152
143
|
};
|
|
153
|
-
export const
|
|
144
|
+
export const assignMemberRole = {
|
|
154
145
|
method: "POST",
|
|
155
|
-
path: (input) => `/api/tenants/${input.orgId}/members/${input.
|
|
156
|
-
body: (input) => ({
|
|
157
|
-
provider: input.provider,
|
|
158
|
-
...(input.accountId ? { accountId: input.accountId } : {}),
|
|
159
|
-
...(input.password ? { password: input.password } : {}),
|
|
160
|
-
}),
|
|
146
|
+
path: (input) => `/api/tenants/${input.orgId}/members/${input.memberId}/roles`,
|
|
147
|
+
body: (input) => ({ roleId: input.roleId }),
|
|
161
148
|
parseOutput: (data) => data,
|
|
162
149
|
parseError: parseApiError,
|
|
163
150
|
};
|
|
164
|
-
export const
|
|
151
|
+
export const removeMemberRole = {
|
|
165
152
|
method: "DELETE",
|
|
166
|
-
path: (input) => `/api/tenants/${input.orgId}/members/${input.
|
|
153
|
+
path: (input) => `/api/tenants/${input.orgId}/members/${input.memberId}/roles/${input.roleId}`,
|
|
167
154
|
parseOutput: () => ({ ok: true }),
|
|
168
155
|
parseError: parseApiError,
|
|
169
156
|
};
|
|
170
|
-
|
|
157
|
+
/** The caller's own effective role/permissions inside a tenant. */
|
|
158
|
+
export const myTenantPermissions = {
|
|
171
159
|
method: "GET",
|
|
172
|
-
path: (input) => `/api/tenants/${input.orgId}/
|
|
160
|
+
path: (input) => `/api/tenants/${input.orgId}/permissions/me`,
|
|
173
161
|
parseOutput: (data) => data,
|
|
174
162
|
parseError: parseApiError,
|
|
175
163
|
};
|
|
176
|
-
export const revokeMemberToken = {
|
|
177
|
-
method: "DELETE",
|
|
178
|
-
path: (input) => `/api/tenants/${input.orgId}/members/${input.userId}/tokens/${input.tokenId}`,
|
|
179
|
-
parseOutput: () => ({ ok: true }),
|
|
180
|
-
parseError: parseApiError,
|
|
181
|
-
};
|
|
182
164
|
//# sourceMappingURL=tenants.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tenants.js","sourceRoot":"","sources":["../../src/endpoints/tenants.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"tenants.js","sourceRoot":"","sources":["../../src/endpoints/tenants.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { Endpoint } from "../endpoint.js";
|
|
2
|
+
import type { ApiError } from "../result.js";
|
|
3
|
+
import type { AuthSuccess, TwoFactorEnableResponse } from "../types.js";
|
|
4
|
+
/**
|
|
5
|
+
* Start TOTP enrolment (cookie-auth). Returns the secret, the
|
|
6
|
+
* `otpauth://` URI to render as a QR, and 10 single-use backup codes
|
|
7
|
+
* that are shown exactly once. Enrolment isn't active until
|
|
8
|
+
* {@link twoFactorConfirm} verifies the first code.
|
|
9
|
+
*/
|
|
10
|
+
export declare const twoFactorEnable: Endpoint<void, TwoFactorEnableResponse, ApiError>;
|
|
11
|
+
export declare const twoFactorConfirm: Endpoint<{
|
|
12
|
+
code: string;
|
|
13
|
+
}, {
|
|
14
|
+
ok: true;
|
|
15
|
+
}, ApiError>;
|
|
16
|
+
/** Requires a current TOTP code; wipes the secret + backup codes. */
|
|
17
|
+
export declare const twoFactorDisable: Endpoint<{
|
|
18
|
+
code: string;
|
|
19
|
+
}, {
|
|
20
|
+
ok: true;
|
|
21
|
+
}, ApiError>;
|
|
22
|
+
/**
|
|
23
|
+
* Complete a password sign-in that returned a
|
|
24
|
+
* {@link TwoFactorChallenge}: `token` is the challenge token, `code`
|
|
25
|
+
* the current TOTP code. Sets the session cookie on success.
|
|
26
|
+
*/
|
|
27
|
+
export declare const verifyTotp: Endpoint<{
|
|
28
|
+
token: string;
|
|
29
|
+
code: string;
|
|
30
|
+
}, AuthSuccess, ApiError>;
|
|
31
|
+
/**
|
|
32
|
+
* Step-up re-verification for an already authenticated caller (cookie
|
|
33
|
+
* or bearer). Answers whether `code` is a current TOTP code for the
|
|
34
|
+
* caller without touching sessions or tokens — resource servers use it
|
|
35
|
+
* to gate sensitive actions (payments, key exports) on a fresh second
|
|
36
|
+
* factor. `enabled: false` means the caller has no verified TOTP
|
|
37
|
+
* enrolment (and `valid` is then always false).
|
|
38
|
+
*/
|
|
39
|
+
export declare const twoFactorStepUp: Endpoint<{
|
|
40
|
+
code: string;
|
|
41
|
+
}, {
|
|
42
|
+
enabled: boolean;
|
|
43
|
+
valid: boolean;
|
|
44
|
+
}, ApiError>;
|
|
45
|
+
/** Like {@link verifyTotp} but consumes a single-use backup code. */
|
|
46
|
+
export declare const verifyBackupCode: Endpoint<{
|
|
47
|
+
token: string;
|
|
48
|
+
code: string;
|
|
49
|
+
}, AuthSuccess, ApiError>;
|
|
50
|
+
//# sourceMappingURL=two-factor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"two-factor.d.ts","sourceRoot":"","sources":["../../src/endpoints/two-factor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAE7C,OAAO,KAAK,EAAE,WAAW,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAExE;;;;;GAKG;AACH,eAAO,MAAM,eAAe,EAAE,QAAQ,CAAC,IAAI,EAAE,uBAAuB,EAAE,QAAQ,CAK7E,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,QAAQ,CAAC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,EAAE,QAAQ,CAM/E,CAAC;AAEF,qEAAqE;AACrE,eAAO,MAAM,gBAAgB,EAAE,QAAQ,CAAC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,EAAE,QAAQ,CAM/E,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,UAAU,EAAE,QAAQ,CAC/B;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAC/B,WAAW,EACX,QAAQ,CAOT,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,eAAe,EAAE,QAAQ,CACpC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,EAChB;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,EACpC,QAAQ,CAOT,CAAC;AAEF,qEAAqE;AACrE,eAAO,MAAM,gBAAgB,EAAE,QAAQ,CACrC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAC/B,WAAW,EACX,QAAQ,CAOT,CAAC"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { parseApiError } from "../result.js";
|
|
2
|
+
/**
|
|
3
|
+
* Start TOTP enrolment (cookie-auth). Returns the secret, the
|
|
4
|
+
* `otpauth://` URI to render as a QR, and 10 single-use backup codes
|
|
5
|
+
* that are shown exactly once. Enrolment isn't active until
|
|
6
|
+
* {@link twoFactorConfirm} verifies the first code.
|
|
7
|
+
*/
|
|
8
|
+
export const twoFactorEnable = {
|
|
9
|
+
method: "POST",
|
|
10
|
+
path: () => "/api/auth/two-factor/enable",
|
|
11
|
+
parseOutput: (data) => data,
|
|
12
|
+
parseError: parseApiError,
|
|
13
|
+
};
|
|
14
|
+
export const twoFactorConfirm = {
|
|
15
|
+
method: "POST",
|
|
16
|
+
path: () => "/api/auth/two-factor/confirm",
|
|
17
|
+
body: (input) => input,
|
|
18
|
+
parseOutput: () => ({ ok: true }),
|
|
19
|
+
parseError: parseApiError,
|
|
20
|
+
};
|
|
21
|
+
/** Requires a current TOTP code; wipes the secret + backup codes. */
|
|
22
|
+
export const twoFactorDisable = {
|
|
23
|
+
method: "POST",
|
|
24
|
+
path: () => "/api/auth/two-factor/disable",
|
|
25
|
+
body: (input) => input,
|
|
26
|
+
parseOutput: () => ({ ok: true }),
|
|
27
|
+
parseError: parseApiError,
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* Complete a password sign-in that returned a
|
|
31
|
+
* {@link TwoFactorChallenge}: `token` is the challenge token, `code`
|
|
32
|
+
* the current TOTP code. Sets the session cookie on success.
|
|
33
|
+
*/
|
|
34
|
+
export const verifyTotp = {
|
|
35
|
+
method: "POST",
|
|
36
|
+
path: () => "/api/auth/two-factor/verify-totp",
|
|
37
|
+
body: (input) => input,
|
|
38
|
+
parseOutput: (data) => data,
|
|
39
|
+
parseError: parseApiError,
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* Step-up re-verification for an already authenticated caller (cookie
|
|
43
|
+
* or bearer). Answers whether `code` is a current TOTP code for the
|
|
44
|
+
* caller without touching sessions or tokens — resource servers use it
|
|
45
|
+
* to gate sensitive actions (payments, key exports) on a fresh second
|
|
46
|
+
* factor. `enabled: false` means the caller has no verified TOTP
|
|
47
|
+
* enrolment (and `valid` is then always false).
|
|
48
|
+
*/
|
|
49
|
+
export const twoFactorStepUp = {
|
|
50
|
+
method: "POST",
|
|
51
|
+
path: () => "/api/me/two-factor/step-up",
|
|
52
|
+
body: (input) => input,
|
|
53
|
+
parseOutput: (data) => data,
|
|
54
|
+
parseError: parseApiError,
|
|
55
|
+
};
|
|
56
|
+
/** Like {@link verifyTotp} but consumes a single-use backup code. */
|
|
57
|
+
export const verifyBackupCode = {
|
|
58
|
+
method: "POST",
|
|
59
|
+
path: () => "/api/auth/two-factor/verify-backup-code",
|
|
60
|
+
body: (input) => input,
|
|
61
|
+
parseOutput: (data) => data,
|
|
62
|
+
parseError: parseApiError,
|
|
63
|
+
};
|
|
64
|
+
//# sourceMappingURL=two-factor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"two-factor.js","sourceRoot":"","sources":["../../src/endpoints/two-factor.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAG7C;;;;;GAKG;AACH,MAAM,CAAC,MAAM,eAAe,GAAsD;IAChF,MAAM,EAAE,MAAM;IACd,IAAI,EAAE,GAAG,EAAE,CAAC,6BAA6B;IACzC,WAAW,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAA+B;IACtD,UAAU,EAAE,aAAa;CAC1B,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAuD;IAClF,MAAM,EAAE,MAAM;IACd,IAAI,EAAE,GAAG,EAAE,CAAC,8BAA8B;IAC1C,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK;IACtB,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IACjC,UAAU,EAAE,aAAa;CAC1B,CAAC;AAEF,qEAAqE;AACrE,MAAM,CAAC,MAAM,gBAAgB,GAAuD;IAClF,MAAM,EAAE,MAAM;IACd,IAAI,EAAE,GAAG,EAAE,CAAC,8BAA8B;IAC1C,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK;IACtB,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IACjC,UAAU,EAAE,aAAa;CAC1B,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,UAAU,GAInB;IACF,MAAM,EAAE,MAAM;IACd,IAAI,EAAE,GAAG,EAAE,CAAC,kCAAkC;IAC9C,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK;IACtB,WAAW,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAmB;IAC1C,UAAU,EAAE,aAAa;CAC1B,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,eAAe,GAIxB;IACF,MAAM,EAAE,MAAM;IACd,IAAI,EAAE,GAAG,EAAE,CAAC,4BAA4B;IACxC,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK;IACtB,WAAW,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAA4C;IACnE,UAAU,EAAE,aAAa;CAC1B,CAAC;AAEF,qEAAqE;AACrE,MAAM,CAAC,MAAM,gBAAgB,GAIzB;IACF,MAAM,EAAE,MAAM;IACd,IAAI,EAAE,GAAG,EAAE,CAAC,yCAAyC;IACrD,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK;IACtB,WAAW,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAmB;IAC1C,UAAU,EAAE,aAAa;CAC1B,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -2,4 +2,5 @@ export { createClient, type ClientConfig, type Endpoint, type EndpointError, typ
|
|
|
2
2
|
export { err, ok, parseApiError, type ApiError, type NetworkError, type Result, } from "./result.js";
|
|
3
3
|
export * from "./endpoints/index.js";
|
|
4
4
|
export type * from "./types.js";
|
|
5
|
+
export { isTwoFactorChallenge } from "./types.js";
|
|
5
6
|
//# 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":"AACA,OAAO,EACL,YAAY,EACZ,KAAK,YAAY,EACjB,KAAK,QAAQ,EACb,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,MAAM,EACX,KAAK,QAAQ,GACd,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,GAAG,EACH,EAAE,EACF,aAAa,EACb,KAAK,QAAQ,EACb,KAAK,YAAY,EACjB,KAAK,MAAM,GACZ,MAAM,aAAa,CAAC;AAGrB,cAAc,sBAAsB,CAAC;AAGrC,mBAAmB,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,YAAY,EACZ,KAAK,YAAY,EACjB,KAAK,QAAQ,EACb,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,MAAM,EACX,KAAK,QAAQ,GACd,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,GAAG,EACH,EAAE,EACF,aAAa,EACb,KAAK,QAAQ,EACb,KAAK,YAAY,EACjB,KAAK,MAAM,GACZ,MAAM,aAAa,CAAC;AAGrB,cAAc,sBAAsB,CAAC;AAGrC,mBAAmB,YAAY,CAAC;AAChC,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -3,4 +3,5 @@ export { createClient, } from "./endpoint.js";
|
|
|
3
3
|
export { err, ok, parseApiError, } from "./result.js";
|
|
4
4
|
// Endpoints — all named exports, grouped by domain
|
|
5
5
|
export * from "./endpoints/index.js";
|
|
6
|
+
export { isTwoFactorChallenge } from "./types.js";
|
|
6
7
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,uBAAuB;AACvB,OAAO,EACL,YAAY,GAQb,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,GAAG,EACH,EAAE,EACF,aAAa,GAId,MAAM,aAAa,CAAC;AAErB,mDAAmD;AACnD,cAAc,sBAAsB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,uBAAuB;AACvB,OAAO,EACL,YAAY,GAQb,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,GAAG,EACH,EAAE,EACF,aAAa,GAId,MAAM,aAAa,CAAC;AAErB,mDAAmD;AACnD,cAAc,sBAAsB,CAAC;AAIrC,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/types.d.ts
CHANGED
|
@@ -39,6 +39,62 @@ export interface AuthSuccess {
|
|
|
39
39
|
user: SessionUser;
|
|
40
40
|
session?: SessionRow;
|
|
41
41
|
}
|
|
42
|
+
/**
|
|
43
|
+
* Password sign-in for a 2FA-enrolled user returns this instead of
|
|
44
|
+
* {@link AuthSuccess}; complete the flow with `verifyTotp` or
|
|
45
|
+
* `verifyBackupCode`, echoing the token back.
|
|
46
|
+
*/
|
|
47
|
+
export interface TwoFactorChallenge {
|
|
48
|
+
twoFactorRequired: true;
|
|
49
|
+
twoFactorToken: string;
|
|
50
|
+
}
|
|
51
|
+
export type SignInResult = AuthSuccess | TwoFactorChallenge;
|
|
52
|
+
export declare const isTwoFactorChallenge: (r: SignInResult) => r is TwoFactorChallenge;
|
|
53
|
+
export interface TwoFactorEnableResponse {
|
|
54
|
+
/** Base32 TOTP secret, for manual authenticator entry. */
|
|
55
|
+
secret: string;
|
|
56
|
+
/** `otpauth://totp/...` URI — render as a QR code. */
|
|
57
|
+
uri: string;
|
|
58
|
+
/** 10 single-use backup codes, shown exactly once. */
|
|
59
|
+
backupCodes: string[];
|
|
60
|
+
}
|
|
61
|
+
export interface ApiTokenRow {
|
|
62
|
+
id: string;
|
|
63
|
+
name: string | null;
|
|
64
|
+
/** Display prefix of the plaintext ("um_a1b2c"). */
|
|
65
|
+
start: string | null;
|
|
66
|
+
status: "active" | "revoked" | "expired" | (string & {});
|
|
67
|
+
createdAt: string;
|
|
68
|
+
expiresAt: string | null;
|
|
69
|
+
revokedAt: string | null;
|
|
70
|
+
lastUsedAt: string | null;
|
|
71
|
+
}
|
|
72
|
+
export interface ApiTokenCreated {
|
|
73
|
+
id: string;
|
|
74
|
+
/** The full plaintext token — shown exactly once, never stored. */
|
|
75
|
+
token: string;
|
|
76
|
+
name: string;
|
|
77
|
+
start: string;
|
|
78
|
+
expiresAt: string | null;
|
|
79
|
+
}
|
|
80
|
+
export interface PasskeyItem {
|
|
81
|
+
id: string;
|
|
82
|
+
name: string | null;
|
|
83
|
+
createdAt: string | null;
|
|
84
|
+
deviceType: string;
|
|
85
|
+
backedUp: boolean;
|
|
86
|
+
transports: string | null;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* WebAuthn ceremony start: `options` is the standard
|
|
90
|
+
* `PublicKeyCredential{Creation,Request}Options` JSON (base64url
|
|
91
|
+
* fields) for the browser; `challenge` is the opaque server handle to
|
|
92
|
+
* echo back on finish.
|
|
93
|
+
*/
|
|
94
|
+
export interface WebAuthnCeremonyStart {
|
|
95
|
+
challenge: string;
|
|
96
|
+
options: Record<string, unknown>;
|
|
97
|
+
}
|
|
42
98
|
export interface MeResponse {
|
|
43
99
|
user: {
|
|
44
100
|
id: string;
|
|
@@ -80,15 +136,44 @@ export interface RefreshToken {
|
|
|
80
136
|
}
|
|
81
137
|
export interface AdminUserRow {
|
|
82
138
|
id: string;
|
|
139
|
+
/** Display name — kept in sync with first/last when those are set. */
|
|
83
140
|
name: string;
|
|
141
|
+
firstName: string | null;
|
|
142
|
+
lastName: string | null;
|
|
84
143
|
email: string;
|
|
85
144
|
role: UserRole;
|
|
86
145
|
status: UserStatus;
|
|
87
146
|
type: UserType;
|
|
147
|
+
/** Linked auth providers — "credential" plus any social ids. */
|
|
148
|
+
providers: string[];
|
|
88
149
|
deletedAt: string | null;
|
|
89
150
|
createdAt: string;
|
|
90
151
|
updatedAt: string;
|
|
91
152
|
}
|
|
153
|
+
export interface AuthAccount {
|
|
154
|
+
id: string;
|
|
155
|
+
providerId: string;
|
|
156
|
+
createdAt: string;
|
|
157
|
+
}
|
|
158
|
+
export interface AuthPasskey {
|
|
159
|
+
id: string;
|
|
160
|
+
name: string | null;
|
|
161
|
+
deviceType: string;
|
|
162
|
+
createdAt: string | null;
|
|
163
|
+
}
|
|
164
|
+
export interface AuthMethodsResponse {
|
|
165
|
+
accounts: AuthAccount[];
|
|
166
|
+
passkeys: AuthPasskey[];
|
|
167
|
+
twoFactorEnabled: boolean;
|
|
168
|
+
}
|
|
169
|
+
export interface UserMembership {
|
|
170
|
+
memberId: string;
|
|
171
|
+
organizationId: string;
|
|
172
|
+
organizationName: string;
|
|
173
|
+
organizationSlug: string;
|
|
174
|
+
role: TenantRole;
|
|
175
|
+
createdAt: string;
|
|
176
|
+
}
|
|
92
177
|
export interface AdminUserListResponse {
|
|
93
178
|
total: number;
|
|
94
179
|
rows: AdminUserRow[];
|
|
@@ -97,79 +182,78 @@ export interface TenantRow {
|
|
|
97
182
|
id: string;
|
|
98
183
|
name: string;
|
|
99
184
|
slug: string;
|
|
185
|
+
/** Project the tenant lives in; null for legacy tenants. */
|
|
186
|
+
projectId?: string | null;
|
|
100
187
|
createdAt: string;
|
|
101
188
|
memberCount: number;
|
|
102
189
|
}
|
|
190
|
+
export type TenancyMode = "multi" | "single";
|
|
191
|
+
export interface ProjectRow {
|
|
192
|
+
id: string;
|
|
193
|
+
name: string;
|
|
194
|
+
slug: string;
|
|
195
|
+
ownerUserId: string;
|
|
196
|
+
tenancyMode: TenancyMode;
|
|
197
|
+
allowTenantCreation: boolean;
|
|
198
|
+
allowSignup: boolean;
|
|
199
|
+
metadata: Record<string, unknown> | null;
|
|
200
|
+
tenantCount?: number;
|
|
201
|
+
createdAt: string;
|
|
202
|
+
updatedAt: string;
|
|
203
|
+
}
|
|
103
204
|
export interface Member {
|
|
104
205
|
id: string;
|
|
105
206
|
organizationId: string;
|
|
106
207
|
userId: string;
|
|
107
208
|
role: TenantRole;
|
|
108
|
-
|
|
109
|
-
|
|
209
|
+
/** Custom tenant roles assigned to this member. */
|
|
210
|
+
roles?: MemberRoleRef[];
|
|
110
211
|
createdAt: string;
|
|
212
|
+
user: {
|
|
213
|
+
name: string;
|
|
214
|
+
email: string;
|
|
215
|
+
image: string | null;
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
export interface MemberRoleRef {
|
|
219
|
+
id: string;
|
|
220
|
+
name: string;
|
|
111
221
|
}
|
|
112
222
|
export interface FullOrganization {
|
|
113
223
|
id: string;
|
|
114
224
|
name: string;
|
|
115
225
|
slug: string;
|
|
226
|
+
logo?: string | null;
|
|
227
|
+
/** Per-tenant settings blob; null when unset. */
|
|
228
|
+
metadata?: Record<string, unknown> | null;
|
|
116
229
|
members: Member[];
|
|
230
|
+
invitations: Invitation[];
|
|
117
231
|
}
|
|
118
232
|
export interface Invitation {
|
|
119
233
|
id: string;
|
|
120
234
|
email: string;
|
|
121
235
|
role: TenantRole;
|
|
122
|
-
status: "pending" | "accepted" | "rejected" | "expired";
|
|
236
|
+
status: "pending" | "accepted" | "rejected" | "expired" | (string & {});
|
|
123
237
|
organizationId: string;
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
id: string;
|
|
127
|
-
name: string;
|
|
128
|
-
email: string;
|
|
129
|
-
emailVerified: boolean;
|
|
130
|
-
role: TenantRole;
|
|
131
|
-
status: UserStatus;
|
|
132
|
-
createdAt: string;
|
|
133
|
-
memberSince: string;
|
|
238
|
+
expiresAt?: string;
|
|
239
|
+
createdAt?: string;
|
|
134
240
|
}
|
|
135
241
|
export interface RoleRow {
|
|
136
242
|
id: string;
|
|
137
243
|
name: string;
|
|
138
244
|
description: string | null;
|
|
245
|
+
/** Permission strings granted by this role (e.g. `invoices:read`). */
|
|
246
|
+
permissions: string[];
|
|
139
247
|
createdAt: string;
|
|
140
248
|
updatedAt: string;
|
|
141
249
|
}
|
|
142
|
-
export interface
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
export interface AuthMethod {
|
|
150
|
-
provider: string;
|
|
151
|
-
createdAt: string;
|
|
152
|
-
}
|
|
153
|
-
export interface AdminUserDetail {
|
|
154
|
-
id: string;
|
|
155
|
-
name: string;
|
|
156
|
-
email: string;
|
|
157
|
-
emailVerified: boolean;
|
|
158
|
-
role: UserRole;
|
|
159
|
-
status: UserStatus;
|
|
160
|
-
type: UserType;
|
|
161
|
-
banned: boolean;
|
|
162
|
-
twoFactorEnabled: boolean;
|
|
163
|
-
authMethods: AuthMethod[];
|
|
164
|
-
deletedAt: string | null;
|
|
165
|
-
createdAt: string;
|
|
166
|
-
updatedAt: string;
|
|
167
|
-
}
|
|
168
|
-
export interface UserRoleRow {
|
|
169
|
-
id: string;
|
|
170
|
-
name: string;
|
|
171
|
-
description: string | null;
|
|
172
|
-
assigned: boolean;
|
|
250
|
+
export interface MyTenantPermissions {
|
|
251
|
+
/** Built-in membership role; null for a non-member superadmin. */
|
|
252
|
+
role: TenantRole | null;
|
|
253
|
+
/** Names of assigned custom roles. */
|
|
254
|
+
roles: string[];
|
|
255
|
+
/** Union of permissions granted by those roles, sorted. */
|
|
256
|
+
permissions: string[];
|
|
173
257
|
}
|
|
174
258
|
export interface ApiErrorBody {
|
|
175
259
|
code?: string;
|
package/dist/types.d.ts.map
CHANGED
|
@@ -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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"}
|