@atlasauth/backend 0.14.1 → 0.16.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/CHANGELOG.md +42 -0
- package/dist/access-control.d.ts +53 -0
- package/dist/access-control.js +46 -0
- package/dist/access-control.js.map +1 -0
- package/dist/algs.d.ts +7 -0
- package/dist/algs.js +11 -0
- package/dist/algs.js.map +1 -0
- package/dist/botid.d.ts +70 -0
- package/dist/botid.js +88 -0
- package/dist/botid.js.map +1 -0
- package/dist/client/action-gallery.d.ts +215 -0
- package/dist/client/action-gallery.js +66 -0
- package/dist/client/action-gallery.js.map +1 -0
- package/dist/client/actions.d.ts +21 -0
- package/dist/client/actions.js.map +1 -1
- package/dist/client/api-keys.d.ts +49 -4
- package/dist/client/api-keys.js +6 -2
- package/dist/client/api-keys.js.map +1 -1
- package/dist/client/app-roles.d.ts +76 -0
- package/dist/client/app-roles.js +39 -0
- package/dist/client/app-roles.js.map +1 -0
- package/dist/client/attack-protection.d.ts +33 -1
- package/dist/client/attack-protection.js.map +1 -1
- package/dist/client/billing-plans.d.ts +93 -0
- package/dist/client/billing-plans.js +31 -0
- package/dist/client/billing-plans.js.map +1 -1
- package/dist/client/custom-oauth-providers.d.ts +243 -0
- package/dist/client/custom-oauth-providers.js +60 -0
- package/dist/client/custom-oauth-providers.js.map +1 -0
- package/dist/client/email-templates.d.ts +1 -1
- package/dist/client/email-templates.js.map +1 -1
- package/dist/client/index.d.ts +157 -3
- package/dist/client/index.js +11 -0
- package/dist/client/index.js.map +1 -1
- package/dist/client/instance-security.d.ts +104 -0
- package/dist/client/instance-security.js +28 -0
- package/dist/client/instance-security.js.map +1 -1
- package/dist/client/notifications.d.ts +1 -1
- package/dist/client/notifications.js.map +1 -1
- package/dist/client/oauth-clients.d.ts +84 -2
- package/dist/client/oauth-clients.js +13 -0
- package/dist/client/oauth-clients.js.map +1 -1
- package/dist/client/referrals.d.ts +1 -1
- package/dist/client/resource-servers.d.ts +34 -5
- package/dist/client/resource-servers.js.map +1 -1
- package/dist/client/risk-based-mfa.d.ts +3 -0
- package/dist/client/risk-based-mfa.js.map +1 -1
- package/dist/client/scim-tokens.d.ts +18 -0
- package/dist/client/scim-tokens.js +4 -0
- package/dist/client/scim-tokens.js.map +1 -1
- package/dist/client/sessions.d.ts +16 -0
- package/dist/client/sessions.js +15 -0
- package/dist/client/sessions.js.map +1 -1
- package/dist/client/sso-connections.d.ts +105 -0
- package/dist/client/sso-connections.js +29 -0
- package/dist/client/sso-connections.js.map +1 -1
- package/dist/client/users.d.ts +40 -4
- package/dist/client/users.js +8 -3
- package/dist/client/users.js.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.js +18 -1
- package/dist/index.js.map +1 -1
- package/dist/logout-token.d.ts +1 -1
- package/dist/logout-token.js +3 -2
- package/dist/logout-token.js.map +1 -1
- package/dist/oauth-resource.d.ts +225 -0
- package/dist/oauth-resource.js +469 -0
- package/dist/oauth-resource.js.map +1 -0
- package/dist/oidc.d.ts +1 -1
- package/dist/oidc.js +5 -3
- package/dist/oidc.js.map +1 -1
- package/dist/referral-test-calls.d.ts +7 -7
- package/dist/referral-test-calls.js +2 -2
- package/dist/testing.d.ts +6 -4
- package/dist/testing.js +7 -6
- package/dist/testing.js.map +1 -1
- package/dist/verify.d.ts +11 -0
- package/dist/verify.js +15 -1
- package/dist/verify.js.map +1 -1
- package/package.json +3 -3
package/dist/client/actions.d.ts
CHANGED
|
@@ -40,15 +40,34 @@ export interface ActionTestEvent {
|
|
|
40
40
|
email?: string;
|
|
41
41
|
emailVerified?: boolean;
|
|
42
42
|
metadata?: Record<string, unknown>;
|
|
43
|
+
/** The user's organization memberships, as `event.user.organizations`. */
|
|
44
|
+
organizations?: Array<{
|
|
45
|
+
id: string;
|
|
46
|
+
slug: string;
|
|
47
|
+
name: string;
|
|
48
|
+
role: string;
|
|
49
|
+
}>;
|
|
43
50
|
};
|
|
44
51
|
connection?: {
|
|
45
52
|
strategy?: string;
|
|
46
53
|
};
|
|
54
|
+
/** `country` is the ISO code `event.request.country` should carry. */
|
|
47
55
|
request?: {
|
|
48
56
|
ip?: string;
|
|
49
57
|
user_agent?: string;
|
|
58
|
+
country?: string;
|
|
50
59
|
};
|
|
51
60
|
}
|
|
61
|
+
/** An outbound request the code queued with `api.http` (a dry run sends nothing). */
|
|
62
|
+
export interface ActionTestHttpRequest {
|
|
63
|
+
method: 'GET' | 'POST';
|
|
64
|
+
/** Query values are masked. */
|
|
65
|
+
url: string;
|
|
66
|
+
/** Header names only; values are never echoed. */
|
|
67
|
+
header_names: string[];
|
|
68
|
+
has_body: boolean;
|
|
69
|
+
save_response_as: string | null;
|
|
70
|
+
}
|
|
52
71
|
/** What an action produced against a sample event — no real data is touched. */
|
|
53
72
|
export interface ActionTestResult {
|
|
54
73
|
object: 'action_test_result';
|
|
@@ -59,6 +78,8 @@ export interface ActionTestResult {
|
|
|
59
78
|
id_token_claims: Record<string, unknown>;
|
|
60
79
|
app_metadata: Record<string, unknown>;
|
|
61
80
|
logs: string[];
|
|
81
|
+
/** What the code queued with `api.http`; sent only on a real post_login / post_user_registration run. */
|
|
82
|
+
http_requests?: ActionTestHttpRequest[];
|
|
62
83
|
error: string | null;
|
|
63
84
|
}
|
|
64
85
|
/** The ordered binding list for a trigger, replaced atomically as a set. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"actions.js","sourceRoot":"","sources":["../../src/client/actions.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"actions.js","sourceRoot":"","sources":["../../src/client/actions.ts"],"names":[],"mappings":";;AAwFA,0CAkCC;AA1HD,uCAAgD;AAwFhD,SAAgB,eAAe,CAAC,OAAkB;IAChD,OAAO;QACL,IAAI;YACF,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAAC;QACzD,CAAC;QACD,MAAM,CAAC,IAAsB,EAAE,cAAuB;YACpD,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;QAChF,CAAC;QACD,GAAG,CAAC,EAAU;YACZ,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,eAAe,IAAA,aAAG,EAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QACpE,CAAC;QACD,MAAM,CAAC,EAAU,EAAE,IAAsB;YACvC,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,eAAe,IAAA,aAAG,EAAC,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5E,CAAC;QACD,MAAM,CAAC,EAAU;YACf,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,eAAe,IAAA,aAAG,EAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QACvE,CAAC;QACD,2EAA2E;QAC3E,IAAI,CAAC,EAAU,EAAE,QAAyB,EAAE;YAC1C,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,IAAA,aAAG,EAAC,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;QAC3F,CAAC;QACD,oDAAoD;QACpD,WAAW,CAAC,OAAsB;YAChC,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,wBAAwB,IAAA,aAAG,EAAC,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;QAClF,CAAC;QACD,+CAA+C;QAC/C,WAAW,CAAC,OAAsB,EAAE,SAAmB;YACrD,OAAO,OAAO,CAAC;gBACb,MAAM,EAAE,KAAK;gBACb,IAAI,EAAE,wBAAwB,IAAA,aAAG,EAAC,OAAO,CAAC,EAAE;gBAC5C,IAAI,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE;aAChC,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -20,11 +20,31 @@ export interface ApiKey {
|
|
|
20
20
|
limits?: ApiKeyLimit[] | null;
|
|
21
21
|
/** Each cap with its current-window usage (empty when the key has no caps). */
|
|
22
22
|
usage?: ApiKeyLimitState[];
|
|
23
|
+
/** A disabled key fails verify until re-enabled (it is not revoked). */
|
|
24
|
+
enabled?: boolean;
|
|
25
|
+
/** Per-key verify rate limit, or null. */
|
|
26
|
+
rate_limit?: ApiKeyRateLimit | null;
|
|
27
|
+
/** Uses left (each successful verify spends one); null = unlimited. */
|
|
28
|
+
remaining?: number | null;
|
|
23
29
|
last_used_at: number | null;
|
|
24
30
|
expires_at: number | null;
|
|
25
31
|
revoked_at: number | null;
|
|
26
32
|
created_at: number;
|
|
27
33
|
}
|
|
34
|
+
/** At most `max` successful verifies per `window_seconds`. */
|
|
35
|
+
export interface ApiKeyRateLimit {
|
|
36
|
+
max: number;
|
|
37
|
+
window_seconds: number;
|
|
38
|
+
}
|
|
39
|
+
/** Controls shared by create and update. */
|
|
40
|
+
export interface ApiKeyControls {
|
|
41
|
+
/** Default true. A disabled key fails verify and cannot mint tokens. */
|
|
42
|
+
enabled?: boolean;
|
|
43
|
+
/** Per-key verify rate limit; null removes it. */
|
|
44
|
+
rate_limit?: ApiKeyRateLimit | null;
|
|
45
|
+
/** Uses left; null = unlimited. */
|
|
46
|
+
remaining?: number | null;
|
|
47
|
+
}
|
|
28
48
|
/** The window a spend cap counts over. `request` caps a single debit; `day`/`month` are UTC calendar windows; `total` never resets. */
|
|
29
49
|
export type ApiKeyLimitPeriod = 'request' | 'day' | 'month' | 'total';
|
|
30
50
|
/** A per-key spend cap, metered with {@link apiKeysResource} `recordUsage`. */
|
|
@@ -103,17 +123,21 @@ export interface ApiKeyWithSecret extends ApiKey {
|
|
|
103
123
|
secret: string;
|
|
104
124
|
note: string;
|
|
105
125
|
}
|
|
106
|
-
export interface CreateApiKeyBody {
|
|
126
|
+
export interface CreateApiKeyBody extends ApiKeyControls {
|
|
107
127
|
subject_type: ApiKeySubjectType;
|
|
108
128
|
subject_id: string;
|
|
109
129
|
name?: string;
|
|
110
130
|
claims?: Record<string, unknown>;
|
|
111
|
-
/** Epoch ms; null (
|
|
131
|
+
/** Epoch ms; null never expires (omitted: the instance default lifetime, if any). */
|
|
112
132
|
expires_at?: number | null;
|
|
133
|
+
/** Relative expiry; mutually exclusive with `expires_at`. */
|
|
134
|
+
expires_in_seconds?: number;
|
|
135
|
+
/** Custom secret prefix (e.g. `acme` gives `acme_<id>_<secret>`). */
|
|
136
|
+
prefix?: string;
|
|
113
137
|
/** Per-key spend caps, metered with `recordUsage`. */
|
|
114
138
|
limits?: ApiKeyLimit[] | null;
|
|
115
139
|
}
|
|
116
|
-
export interface UpdateApiKeyBody {
|
|
140
|
+
export interface UpdateApiKeyBody extends ApiKeyControls {
|
|
117
141
|
name?: string | null;
|
|
118
142
|
claims?: Record<string, unknown>;
|
|
119
143
|
expires_at?: number | null;
|
|
@@ -128,6 +152,19 @@ export interface UpdateApiKeyBody {
|
|
|
128
152
|
export type ApiKeyVerification = {
|
|
129
153
|
object: 'api_key_verification';
|
|
130
154
|
valid: false;
|
|
155
|
+
} | {
|
|
156
|
+
/**
|
|
157
|
+
* A live key refused by its own policy: `insufficient_scope` (see
|
|
158
|
+
* `missing_scopes`), `rate_limited` (retry after `retry_after_ms`) or
|
|
159
|
+
* `usage_exhausted` (no uses left).
|
|
160
|
+
*/
|
|
161
|
+
object: 'api_key_verification';
|
|
162
|
+
valid: false;
|
|
163
|
+
code: 'insufficient_scope' | 'rate_limited' | 'usage_exhausted';
|
|
164
|
+
id: string;
|
|
165
|
+
missing_scopes?: string[];
|
|
166
|
+
retry_after_ms?: number;
|
|
167
|
+
remaining?: number;
|
|
131
168
|
} | {
|
|
132
169
|
object: 'api_key_verification';
|
|
133
170
|
valid: true;
|
|
@@ -144,6 +181,8 @@ export type ApiKeyVerification = {
|
|
|
144
181
|
usage?: ApiKeyLimitState[];
|
|
145
182
|
last_used_at: number | null;
|
|
146
183
|
expires_at?: number | null;
|
|
184
|
+
/** Uses left after this verify (null = unlimited). */
|
|
185
|
+
remaining?: number | null;
|
|
147
186
|
};
|
|
148
187
|
/**
|
|
149
188
|
* §P1-8 a short-lived, offline-verifiable access JWT minted from a long-lived
|
|
@@ -193,7 +232,13 @@ export declare function apiKeysResource(request: RequestFn): {
|
|
|
193
232
|
/** Mint a key. The secret is returned once, here. */
|
|
194
233
|
create(body: CreateApiKeyBody, idempotencyKey?: string): Promise<ApiKeyWithSecret>;
|
|
195
234
|
/** Check a presented secret. Rate-limited — it is an online credential check. */
|
|
196
|
-
|
|
235
|
+
/**
|
|
236
|
+
* Verify a presented key. `required_scopes`: every one must be on the key,
|
|
237
|
+
* else `{ valid: false, code: 'insufficient_scope' }`.
|
|
238
|
+
*/
|
|
239
|
+
verify(secret: string, options?: {
|
|
240
|
+
required_scopes?: string[];
|
|
241
|
+
}): Promise<ApiKeyVerification>;
|
|
197
242
|
get(id: string): Promise<ApiKey>;
|
|
198
243
|
update(id: string, body: UpdateApiKeyBody): Promise<ApiKey>;
|
|
199
244
|
/** Revoke a key. It stays queryable but never authenticates again. */
|
package/dist/client/api-keys.js
CHANGED
|
@@ -13,8 +13,12 @@ function apiKeysResource(request) {
|
|
|
13
13
|
return request({ method: 'POST', path: '/v1/api_keys', body, idempotencyKey });
|
|
14
14
|
},
|
|
15
15
|
/** Check a presented secret. Rate-limited — it is an online credential check. */
|
|
16
|
-
|
|
17
|
-
|
|
16
|
+
/**
|
|
17
|
+
* Verify a presented key. `required_scopes`: every one must be on the key,
|
|
18
|
+
* else `{ valid: false, code: 'insufficient_scope' }`.
|
|
19
|
+
*/
|
|
20
|
+
verify(secret, options = {}) {
|
|
21
|
+
return request({ method: 'POST', path: '/v1/api_keys/verify', body: { secret, ...options } });
|
|
18
22
|
},
|
|
19
23
|
get(id) {
|
|
20
24
|
return request({ method: 'GET', path: `/v1/api_keys/${(0, request_1.enc)(id)}` });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-keys.js","sourceRoot":"","sources":["../../src/client/api-keys.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"api-keys.js","sourceRoot":"","sources":["../../src/client/api-keys.ts"],"names":[],"mappings":";;AAqPA,0CA6DC;AAlTD,uCAAgD;AAqPhD,SAAgB,eAAe,CAAC,OAAkB;IAChD,OAAO;QACL,0CAA0C;QAC1C,IAAI,CAAC,KAGJ;YACC,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,CAAC;QACjE,CAAC;QACD,qDAAqD;QACrD,MAAM,CAAC,IAAsB,EAAE,cAAuB;YACpD,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;QACjF,CAAC;QACD,iFAAiF;QACjF;;;WAGG;QACH,MAAM,CAAC,MAAc,EAAE,UAA0C,EAAE;YACjE,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,qBAAqB,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,OAAO,EAAE,EAAE,CAAC,CAAC;QAChG,CAAC;QACD,GAAG,CAAC,EAAU;YACZ,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,gBAAgB,IAAA,aAAG,EAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QACrE,CAAC;QACD,MAAM,CAAC,EAAU,EAAE,IAAsB;YACvC,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,gBAAgB,IAAA,aAAG,EAAC,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7E,CAAC;QACD,sEAAsE;QACtE,MAAM,CAAC,EAAU;YACf,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,gBAAgB,IAAA,aAAG,EAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QACxE,CAAC;QACD;;;;;;;WAOG;QACH,WAAW,CAAC,EAAU,EAAE,IAA2B;YACjD,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,IAAA,aAAG,EAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAClF,CAAC;QACD,iFAAiF;QACjF,QAAQ,CAAC,EAAU;YACjB,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,gBAAgB,IAAA,aAAG,EAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC3E,CAAC;QACD;;;WAGG;QACH,SAAS,CAAC,IAAyB;YACjC,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,oBAAoB,EAAE,IAAI,EAAE,CAAC,CAAC;QACvE,CAAC;QACD;;;WAGG;QACH,WAAW,CAAC,QAAiC,EAAE;YAC7C,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,sBAAsB,EAAE,KAAK,EAAE,EAAE,GAAG,KAAK,EAAE,EAAE,CAAC,CAAC;QACvF,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { type RequestFn } from './request';
|
|
2
|
+
import type { ListPage } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* App-level (instance-wide) user roles: roles that are not tied to an
|
|
5
|
+
* organization, each granting permission keys like `tickets:read`. A user's
|
|
6
|
+
* role keys and the union of their permissions travel on the session token as
|
|
7
|
+
* `app_roles` / `app_permissions`; check them offline with
|
|
8
|
+
* `has(claims, { appPermission: 'tickets:read' })` or `hasAppPermission`.
|
|
9
|
+
*/
|
|
10
|
+
export interface AppRole {
|
|
11
|
+
object: 'app_role';
|
|
12
|
+
id: string;
|
|
13
|
+
key: string;
|
|
14
|
+
name: string;
|
|
15
|
+
description: string | null;
|
|
16
|
+
permissions: string[];
|
|
17
|
+
/** On list and create only. */
|
|
18
|
+
users_count?: number;
|
|
19
|
+
created_at: number;
|
|
20
|
+
updated_at: number;
|
|
21
|
+
}
|
|
22
|
+
export interface CreateAppRoleBody {
|
|
23
|
+
/** 2-64 lowercase letters, digits, _ or -, starting with a letter. */
|
|
24
|
+
key: string;
|
|
25
|
+
name: string;
|
|
26
|
+
description?: string | null;
|
|
27
|
+
/** `resource:action` keys (the `org:` namespace is reserved for organizations). */
|
|
28
|
+
permissions?: string[];
|
|
29
|
+
}
|
|
30
|
+
export interface UpdateAppRoleBody {
|
|
31
|
+
name?: string;
|
|
32
|
+
description?: string | null;
|
|
33
|
+
permissions?: string[];
|
|
34
|
+
}
|
|
35
|
+
export interface UserAppRoles {
|
|
36
|
+
object: 'user_app_roles';
|
|
37
|
+
user_id: string;
|
|
38
|
+
roles: AppRole[];
|
|
39
|
+
role_keys: string[];
|
|
40
|
+
permissions: string[];
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Change a user's app roles: `roles` replaces the set; `add`/`remove` change it
|
|
44
|
+
* (role keys or ids). Send one form, not both.
|
|
45
|
+
*/
|
|
46
|
+
export type SetUserAppRolesBody = {
|
|
47
|
+
roles: string[];
|
|
48
|
+
} | {
|
|
49
|
+
add?: string[];
|
|
50
|
+
remove?: string[];
|
|
51
|
+
};
|
|
52
|
+
export declare function appRolesResource(request: RequestFn): {
|
|
53
|
+
list(): Promise<ListPage<AppRole>>;
|
|
54
|
+
create(body: CreateAppRoleBody): Promise<AppRole>;
|
|
55
|
+
/** By id or key. */
|
|
56
|
+
get(idOrKey: string): Promise<AppRole>;
|
|
57
|
+
update(idOrKey: string, body: UpdateAppRoleBody): Promise<AppRole>;
|
|
58
|
+
delete(idOrKey: string): Promise<{
|
|
59
|
+
object: "app_role";
|
|
60
|
+
id: string;
|
|
61
|
+
deleted: true;
|
|
62
|
+
}>;
|
|
63
|
+
/** The users holding a role. */
|
|
64
|
+
listUsers(idOrKey: string, query?: {
|
|
65
|
+
limit?: number;
|
|
66
|
+
offset?: number;
|
|
67
|
+
}): Promise<ListPage<{
|
|
68
|
+
object: "user_app_role";
|
|
69
|
+
user_id: string;
|
|
70
|
+
role: string;
|
|
71
|
+
}>>;
|
|
72
|
+
/** A user's app roles and effective permissions. */
|
|
73
|
+
getForUser(userId: string): Promise<UserAppRoles>;
|
|
74
|
+
setForUser(userId: string, body: SetUserAppRolesBody): Promise<UserAppRoles>;
|
|
75
|
+
removeFromUser(userId: string, idOrKey: string): Promise<UserAppRoles>;
|
|
76
|
+
};
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.appRolesResource = appRolesResource;
|
|
4
|
+
const request_1 = require("./request");
|
|
5
|
+
function appRolesResource(request) {
|
|
6
|
+
return {
|
|
7
|
+
list() {
|
|
8
|
+
return request({ method: 'GET', path: '/v1/app_roles' });
|
|
9
|
+
},
|
|
10
|
+
create(body) {
|
|
11
|
+
return request({ method: 'POST', path: '/v1/app_roles', body });
|
|
12
|
+
},
|
|
13
|
+
/** By id or key. */
|
|
14
|
+
get(idOrKey) {
|
|
15
|
+
return request({ method: 'GET', path: `/v1/app_roles/${(0, request_1.enc)(idOrKey)}` });
|
|
16
|
+
},
|
|
17
|
+
update(idOrKey, body) {
|
|
18
|
+
return request({ method: 'PATCH', path: `/v1/app_roles/${(0, request_1.enc)(idOrKey)}`, body });
|
|
19
|
+
},
|
|
20
|
+
delete(idOrKey) {
|
|
21
|
+
return request({ method: 'DELETE', path: `/v1/app_roles/${(0, request_1.enc)(idOrKey)}` });
|
|
22
|
+
},
|
|
23
|
+
/** The users holding a role. */
|
|
24
|
+
listUsers(idOrKey, query = {}) {
|
|
25
|
+
return request({ method: 'GET', path: `/v1/app_roles/${(0, request_1.enc)(idOrKey)}/users`, query });
|
|
26
|
+
},
|
|
27
|
+
/** A user's app roles and effective permissions. */
|
|
28
|
+
getForUser(userId) {
|
|
29
|
+
return request({ method: 'GET', path: `/v1/users/${(0, request_1.enc)(userId)}/app_roles` });
|
|
30
|
+
},
|
|
31
|
+
setForUser(userId, body) {
|
|
32
|
+
return request({ method: 'POST', path: `/v1/users/${(0, request_1.enc)(userId)}/app_roles`, body });
|
|
33
|
+
},
|
|
34
|
+
removeFromUser(userId, idOrKey) {
|
|
35
|
+
return request({ method: 'DELETE', path: `/v1/users/${(0, request_1.enc)(userId)}/app_roles/${(0, request_1.enc)(idOrKey)}` });
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=app-roles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app-roles.js","sourceRoot":"","sources":["../../src/client/app-roles.ts"],"names":[],"mappings":";;AAoDA,4CAoCC;AAxFD,uCAAgD;AAoDhD,SAAgB,gBAAgB,CAAC,OAAkB;IACjD,OAAO;QACL,IAAI;YACF,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,CAAC;QAC3D,CAAC;QACD,MAAM,CAAC,IAAuB;YAC5B,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC,CAAC;QAClE,CAAC;QACD,oBAAoB;QACpB,GAAG,CAAC,OAAe;YACjB,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,iBAAiB,IAAA,aAAG,EAAC,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;QAC3E,CAAC;QACD,MAAM,CAAC,OAAe,EAAE,IAAuB;YAC7C,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,iBAAiB,IAAA,aAAG,EAAC,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QACnF,CAAC;QACD,MAAM,CAAC,OAAe;YACpB,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,iBAAiB,IAAA,aAAG,EAAC,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;QAC9E,CAAC;QACD,gCAAgC;QAChC,SAAS,CACP,OAAe,EACf,QAA6C,EAAE;YAE/C,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,iBAAiB,IAAA,aAAG,EAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;QACxF,CAAC;QACD,oDAAoD;QACpD,UAAU,CAAC,MAAc;YACvB,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,aAAa,IAAA,aAAG,EAAC,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;QAChF,CAAC;QACD,UAAU,CAAC,MAAc,EAAE,IAAyB;YAClD,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,IAAA,aAAG,EAAC,MAAM,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;QACvF,CAAC;QACD,cAAc,CAAC,MAAc,EAAE,OAAe;YAC5C,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,aAAa,IAAA,aAAG,EAAC,MAAM,CAAC,cAAc,IAAA,aAAG,EAAC,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;QACnG,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -25,8 +25,39 @@ export interface AttackProtection {
|
|
|
25
25
|
secret_set: boolean;
|
|
26
26
|
managed_by: 'auth_config_and_captcha_secret';
|
|
27
27
|
};
|
|
28
|
+
/** Read-only reflections of auth_config.attackProtection. */
|
|
29
|
+
country_restrictions?: {
|
|
30
|
+
mode: 'off' | 'allow' | 'deny';
|
|
31
|
+
countries: string[];
|
|
32
|
+
sign_up: boolean;
|
|
33
|
+
sign_in: boolean;
|
|
34
|
+
block_unknown: boolean;
|
|
35
|
+
managed_by: 'auth_config';
|
|
36
|
+
};
|
|
37
|
+
device_accounts?: {
|
|
38
|
+
enabled: boolean;
|
|
39
|
+
max_accounts: number;
|
|
40
|
+
window_days: number;
|
|
41
|
+
managed_by: 'auth_config';
|
|
42
|
+
};
|
|
43
|
+
/** Dormant-account reactivation alerts (writable). */
|
|
44
|
+
dormant_accounts?: DormantAccountsSettings;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* When an account idle for `threshold_days` signs in again: an audit entry, the
|
|
48
|
+
* `user.reactivated` webhook, an optional security notice to the user, and —
|
|
49
|
+
* with `require_mfa` — a second-factor step-up (`on_no_factor` decides for an
|
|
50
|
+
* account without one).
|
|
51
|
+
*/
|
|
52
|
+
export interface DormantAccountsSettings {
|
|
53
|
+
enabled: boolean;
|
|
54
|
+
/** 1–3650; default 90. */
|
|
55
|
+
threshold_days: number;
|
|
56
|
+
require_mfa: boolean;
|
|
57
|
+
on_no_factor: 'allow' | 'require_enroll' | 'block';
|
|
58
|
+
notify_user: boolean;
|
|
28
59
|
}
|
|
29
|
-
/**
|
|
60
|
+
/** The writable parts; the rest of the object is read-only. */
|
|
30
61
|
export interface UpdateAttackProtectionBody {
|
|
31
62
|
brute_force?: {
|
|
32
63
|
enabled?: boolean;
|
|
@@ -34,6 +65,7 @@ export interface UpdateAttackProtectionBody {
|
|
|
34
65
|
breached_password?: {
|
|
35
66
|
enabled?: boolean;
|
|
36
67
|
};
|
|
68
|
+
dormant_accounts?: Partial<DormantAccountsSettings>;
|
|
37
69
|
}
|
|
38
70
|
export declare function attackProtectionResource(request: RequestFn): {
|
|
39
71
|
get(): Promise<AttackProtection>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attack-protection.js","sourceRoot":"","sources":["../../src/client/attack-protection.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"attack-protection.js","sourceRoot":"","sources":["../../src/client/attack-protection.ts"],"names":[],"mappings":";;AA8DA,4DASC;AATD,SAAgB,wBAAwB,CAAC,OAAkB;IACzD,OAAO;QACL,GAAG;YACD,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,uBAAuB,EAAE,CAAC,CAAC;QACnE,CAAC;QACD,MAAM,CAAC,IAAgC;YACrC,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,uBAAuB,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3E,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -15,11 +15,22 @@ export interface BillingPlan {
|
|
|
15
15
|
amount: string | null;
|
|
16
16
|
currency: string;
|
|
17
17
|
features: string[];
|
|
18
|
+
/** Numeric limits the plan grants (the `ent.limits` claim); `-1` = unlimited. */
|
|
19
|
+
limits?: Record<string, unknown>;
|
|
18
20
|
audience: string;
|
|
19
21
|
active: boolean;
|
|
22
|
+
/** stripe | polar | dodo | creem | chargebee | autumn | commet */
|
|
23
|
+
provider?: BillingProviderName;
|
|
24
|
+
/** The plan's price reference on its provider. */
|
|
25
|
+
provider_price_id?: string | null;
|
|
26
|
+
/** `base`: the subject's main plan. `addon`: bought alongside it; several may be live. */
|
|
27
|
+
kind?: 'base' | 'addon';
|
|
28
|
+
/** Autumn plans: the feature whose usage tracks the org's member count. */
|
|
29
|
+
seat_feature_id?: string | null;
|
|
20
30
|
created_at: number;
|
|
21
31
|
updated_at: number;
|
|
22
32
|
}
|
|
33
|
+
export type BillingProviderName = 'stripe' | 'polar' | 'dodo' | 'creem' | 'chargebee' | 'autumn' | 'commet';
|
|
23
34
|
/**
|
|
24
35
|
* A read view of who is subscribed. `status` is written ONLY by the verified
|
|
25
36
|
* Stripe webhook, never through this SDK.
|
|
@@ -34,9 +45,55 @@ export interface BillingSubscription {
|
|
|
34
45
|
stripe_subscription_id: string | null;
|
|
35
46
|
stripe_customer_id: string | null;
|
|
36
47
|
current_period_end: number | null;
|
|
48
|
+
provider?: BillingProviderName;
|
|
49
|
+
provider_subscription_id?: string | null;
|
|
50
|
+
provider_customer_id?: string | null;
|
|
51
|
+
quantity?: number;
|
|
52
|
+
cancel_at_period_end?: boolean;
|
|
53
|
+
/** What an entitlement provider (Autumn, Commet) reports this subscription grants. */
|
|
54
|
+
entitlements?: {
|
|
55
|
+
features: string[];
|
|
56
|
+
limits: Record<string, number>;
|
|
57
|
+
} | null;
|
|
37
58
|
created_at: number;
|
|
38
59
|
updated_at: number;
|
|
39
60
|
}
|
|
61
|
+
/** How numeric limits merge when a subject holds several entitling subscriptions. */
|
|
62
|
+
export interface BillingSettings {
|
|
63
|
+
object: 'billing_settings';
|
|
64
|
+
default_limit_merge: 'max' | 'sum';
|
|
65
|
+
limit_merge: Record<string, 'max' | 'sum'>;
|
|
66
|
+
}
|
|
67
|
+
export interface UpdateBillingSettingsBody {
|
|
68
|
+
default_limit_merge?: 'max' | 'sum';
|
|
69
|
+
/** Limit key → `max` | `sum`; replaces the stored map. */
|
|
70
|
+
limit_merge?: Record<string, 'max' | 'sum'>;
|
|
71
|
+
}
|
|
72
|
+
/** May a subject use a feature? */
|
|
73
|
+
export interface CheckBillingFeatureBody {
|
|
74
|
+
subject_type: 'user' | 'org';
|
|
75
|
+
subject_id: string;
|
|
76
|
+
feature: string;
|
|
77
|
+
/** Units about to be used (default 1). */
|
|
78
|
+
required?: number;
|
|
79
|
+
}
|
|
80
|
+
export interface BillingFeatureCheck {
|
|
81
|
+
object: 'billing_feature_check';
|
|
82
|
+
feature: string;
|
|
83
|
+
allowed: boolean;
|
|
84
|
+
/** `provider`: asked live of Autumn/Commet; `atlas`: from the resolved entitlement. */
|
|
85
|
+
source: 'provider' | 'atlas';
|
|
86
|
+
provider: string | null;
|
|
87
|
+
remaining: number | null;
|
|
88
|
+
granted: number | null;
|
|
89
|
+
usage: number | null;
|
|
90
|
+
unlimited: boolean;
|
|
91
|
+
}
|
|
92
|
+
export interface ChangeBillingSubscriptionBody {
|
|
93
|
+
plan_id: string;
|
|
94
|
+
interval?: 'month' | 'year';
|
|
95
|
+
schedule_at_period_end?: boolean;
|
|
96
|
+
}
|
|
40
97
|
export interface CreateBillingPlanBody {
|
|
41
98
|
name: string;
|
|
42
99
|
slug: string;
|
|
@@ -49,6 +106,13 @@ export interface CreateBillingPlanBody {
|
|
|
49
106
|
/** One of `user`, `org`. Defaults to `user`. */
|
|
50
107
|
audience?: string;
|
|
51
108
|
active?: boolean;
|
|
109
|
+
limits?: Record<string, unknown>;
|
|
110
|
+
provider?: BillingProviderName;
|
|
111
|
+
provider_price_id?: string;
|
|
112
|
+
/** `base` (default) or `addon`. */
|
|
113
|
+
kind?: 'base' | 'addon';
|
|
114
|
+
/** Autumn: one of the plan's features; its usage follows the org's member count. */
|
|
115
|
+
seat_feature_id?: string | null;
|
|
52
116
|
}
|
|
53
117
|
export interface UpdateBillingPlanBody {
|
|
54
118
|
name?: string;
|
|
@@ -60,6 +124,12 @@ export interface UpdateBillingPlanBody {
|
|
|
60
124
|
features?: string[];
|
|
61
125
|
audience?: string;
|
|
62
126
|
active?: boolean;
|
|
127
|
+
limits?: Record<string, unknown>;
|
|
128
|
+
provider?: BillingProviderName;
|
|
129
|
+
provider_price_id?: string;
|
|
130
|
+
kind?: 'base' | 'addon';
|
|
131
|
+
/** `null` clears it. */
|
|
132
|
+
seat_feature_id?: string | null;
|
|
63
133
|
}
|
|
64
134
|
/** Filter the subscription read view to one subject. */
|
|
65
135
|
export interface ListSubscriptionsParams {
|
|
@@ -83,6 +153,10 @@ export interface ReportBillingUsageBody {
|
|
|
83
153
|
/** Non-negative. */
|
|
84
154
|
quantity: number;
|
|
85
155
|
idempotency_key: string;
|
|
156
|
+
/** Count against this provider feature (an Autumn feature id / Commet feature code). */
|
|
157
|
+
feature?: string;
|
|
158
|
+
/** Attribute to this subscription when the subject holds several. */
|
|
159
|
+
subscription_id?: string;
|
|
86
160
|
}
|
|
87
161
|
export interface BillingUsageReport {
|
|
88
162
|
object: 'billing_usage';
|
|
@@ -109,6 +183,25 @@ export declare function billingResource(request: RequestFn): {
|
|
|
109
183
|
deleted: true;
|
|
110
184
|
}>;
|
|
111
185
|
listSubscriptions(params?: ListSubscriptionsParams): Promise<ListPage<BillingSubscription>>;
|
|
186
|
+
/** One subscription by id (a subject may hold several: a base plan + add-ons). */
|
|
187
|
+
getSubscription(id: string): Promise<BillingSubscription>;
|
|
188
|
+
/** Move one subscription to another plan or interval (now, or at the period end). */
|
|
189
|
+
changeSubscription(id: string, body: ChangeBillingSubscriptionBody): Promise<BillingSubscription & {
|
|
190
|
+
scheduled: boolean;
|
|
191
|
+
}>;
|
|
192
|
+
/** Cancel one subscription at the period end (default) or now. */
|
|
193
|
+
cancelSubscription(id: string, body?: {
|
|
194
|
+
immediately?: boolean;
|
|
195
|
+
}): Promise<BillingSubscription>;
|
|
196
|
+
/** Undo a cancellation scheduled for the period end. */
|
|
197
|
+
restoreSubscription(id: string): Promise<BillingSubscription>;
|
|
198
|
+
/** Mirror a plan's features/limits from its provider (Autumn, Commet). */
|
|
199
|
+
syncPlanEntitlements(id: string): Promise<BillingPlan>;
|
|
200
|
+
/** How limits merge across a subject's several subscriptions. */
|
|
201
|
+
getSettings(): Promise<BillingSettings>;
|
|
202
|
+
updateSettings(body: UpdateBillingSettingsBody): Promise<BillingSettings>;
|
|
203
|
+
/** May a subject use a feature? Live from Autumn/Commet when the subject is on one. */
|
|
204
|
+
checkFeature(body: CheckBillingFeatureBody): Promise<BillingFeatureCheck>;
|
|
112
205
|
/**
|
|
113
206
|
* Adopt an EXISTING Stripe subscription onto a user/org + plan, for
|
|
114
207
|
* migrating billing into Atlas without re-charging. Read-only on Stripe.
|
|
@@ -22,6 +22,37 @@ function billingResource(request) {
|
|
|
22
22
|
listSubscriptions(params) {
|
|
23
23
|
return request({ method: 'GET', path: '/v1/billing/subscriptions', query: { ...params } });
|
|
24
24
|
},
|
|
25
|
+
/** One subscription by id (a subject may hold several: a base plan + add-ons). */
|
|
26
|
+
getSubscription(id) {
|
|
27
|
+
return request({ method: 'GET', path: `/v1/billing/subscriptions/${(0, request_1.enc)(id)}` });
|
|
28
|
+
},
|
|
29
|
+
/** Move one subscription to another plan or interval (now, or at the period end). */
|
|
30
|
+
changeSubscription(id, body) {
|
|
31
|
+
return request({ method: 'POST', path: `/v1/billing/subscriptions/${(0, request_1.enc)(id)}/change`, body });
|
|
32
|
+
},
|
|
33
|
+
/** Cancel one subscription at the period end (default) or now. */
|
|
34
|
+
cancelSubscription(id, body = {}) {
|
|
35
|
+
return request({ method: 'POST', path: `/v1/billing/subscriptions/${(0, request_1.enc)(id)}/cancel`, body });
|
|
36
|
+
},
|
|
37
|
+
/** Undo a cancellation scheduled for the period end. */
|
|
38
|
+
restoreSubscription(id) {
|
|
39
|
+
return request({ method: 'POST', path: `/v1/billing/subscriptions/${(0, request_1.enc)(id)}/restore` });
|
|
40
|
+
},
|
|
41
|
+
/** Mirror a plan's features/limits from its provider (Autumn, Commet). */
|
|
42
|
+
syncPlanEntitlements(id) {
|
|
43
|
+
return request({ method: 'POST', path: `/v1/billing/plans/${(0, request_1.enc)(id)}/sync_entitlements` });
|
|
44
|
+
},
|
|
45
|
+
/** How limits merge across a subject's several subscriptions. */
|
|
46
|
+
getSettings() {
|
|
47
|
+
return request({ method: 'GET', path: '/v1/billing/settings' });
|
|
48
|
+
},
|
|
49
|
+
updateSettings(body) {
|
|
50
|
+
return request({ method: 'PUT', path: '/v1/billing/settings', body });
|
|
51
|
+
},
|
|
52
|
+
/** May a subject use a feature? Live from Autumn/Commet when the subject is on one. */
|
|
53
|
+
checkFeature(body) {
|
|
54
|
+
return request({ method: 'POST', path: '/v1/billing/check', body });
|
|
55
|
+
},
|
|
25
56
|
/**
|
|
26
57
|
* Adopt an EXISTING Stripe subscription onto a user/org + plan, for
|
|
27
58
|
* migrating billing into Atlas without re-charging. Read-only on Stripe.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"billing-plans.js","sourceRoot":"","sources":["../../src/client/billing-plans.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"billing-plans.js","sourceRoot":"","sources":["../../src/client/billing-plans.ts"],"names":[],"mappings":"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"}
|