@atlasauth/js 0.26.1 → 0.28.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 +15 -0
- package/dist/api-keys.d.ts +27 -0
- package/dist/api-keys.js +51 -0
- package/dist/api-keys.js.map +1 -1
- package/dist/avatar.d.ts +20 -0
- package/dist/avatar.js +25 -0
- package/dist/avatar.js.map +1 -0
- package/dist/dev-browser.d.ts +2 -0
- package/dist/dev-browser.js +64 -2
- package/dist/dev-browser.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/instance-settings.d.ts +25 -0
- package/dist/instance-settings.js +36 -1
- package/dist/instance-settings.js.map +1 -1
- package/dist/organization-admin.d.ts +55 -1
- package/dist/organization-admin.js +16 -0
- package/dist/organization-admin.js.map +1 -1
- package/dist/passkey-sign-in.d.ts +73 -17
- package/dist/passkey-sign-in.js +134 -1
- package/dist/passkey-sign-in.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,20 @@
|
|
|
1
1
|
# @atlasauth/js changelog
|
|
2
2
|
|
|
3
|
+
## 0.28.0 — 2026-11-01
|
|
4
|
+
|
|
5
|
+
### Added
|
|
6
|
+
|
|
7
|
+
- `setAvatar(client, file)` and `removeAvatar(client)`: upload (PNG, JPEG, GIF or WebP, 5 MB max) or remove the signed-in user's profile picture.
|
|
8
|
+
|
|
9
|
+
## 0.27.0 — 2026-10-30
|
|
10
|
+
|
|
11
|
+
### Added
|
|
12
|
+
|
|
13
|
+
- `scopeImplications` on the user's API key list, plus the `impliedScopes()` and `scopeGrid()` helpers for a resource by read/write scope picker.
|
|
14
|
+
- `signInWithPasskey`, `startConditionalPasskeySignIn` and `createPasskeySignInController`: usernameless passkey sign-in (button and autofill) for any prebuilt or custom form; a cancelled prompt is a `PASSKEY_CANCELLED` error, never a throw.
|
|
15
|
+
- `InstanceSettings.passkeySignIn` says whether the instance offers passkey sign-in.
|
|
16
|
+
- One `POST /v1/client/tickets/exchange` per ticket: a second exchange of the same ticket within 10 seconds (React StrictMode, a double-mounted router) shares the first answer instead of failing with 400.
|
|
17
|
+
|
|
3
18
|
## 0.26.1 — 2026-10-28
|
|
4
19
|
|
|
5
20
|
- The SDK reports its own version correctly again (the previous release still identified itself as the release before).
|
package/dist/api-keys.d.ts
CHANGED
|
@@ -39,6 +39,11 @@ export interface UserApiKeyList {
|
|
|
39
39
|
allowedScopes: string[];
|
|
40
40
|
/** The claim names a new key may set. */
|
|
41
41
|
allowedClaims: string[];
|
|
42
|
+
/**
|
|
43
|
+
* The instance scope implications (`{ "calls:write": ["calls:read"], "admin": ["*"] }`).
|
|
44
|
+
* Holding a key scope also grants the listed ones; `*` = every scope.
|
|
45
|
+
*/
|
|
46
|
+
scopeImplications: Record<string, string[]>;
|
|
42
47
|
/** The most active keys this user (or organization) may hold. */
|
|
43
48
|
maxActiveKeys: number;
|
|
44
49
|
/** Active (unrevoked, unexpired) keys held now. */
|
|
@@ -90,3 +95,25 @@ export declare function revokeApiKey(client: FapiClient, id: string): Promise<{
|
|
|
90
95
|
id: string;
|
|
91
96
|
revoked: true;
|
|
92
97
|
}>;
|
|
98
|
+
/**
|
|
99
|
+
* The scopes `selected` grants once the instance implications are applied (the
|
|
100
|
+
* same closure verify answers with as `effective_scopes`). `*` expands to every
|
|
101
|
+
* scope the instance names — `allowedScopes` plus both sides of the map.
|
|
102
|
+
*/
|
|
103
|
+
export declare function impliedScopes(selected: readonly string[], implications: Record<string, string[]>, allowedScopes?: readonly string[]): string[];
|
|
104
|
+
/** One row of a resource × read/write grid: the scope behind each cell, when it exists. */
|
|
105
|
+
export interface ScopeGridRow {
|
|
106
|
+
resource: string;
|
|
107
|
+
read?: string;
|
|
108
|
+
write?: string;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Lay a scope vocabulary out as a resource × read/write grid: every
|
|
112
|
+
* `<resource>:read` / `<resource>:write` scope becomes a row, anything else
|
|
113
|
+
* (`admin`, `reports:export`) is returned in `other`. `null` when no scope fits
|
|
114
|
+
* the grid, so a UI falls back to a flat checkbox list.
|
|
115
|
+
*/
|
|
116
|
+
export declare function scopeGrid(allowedScopes: readonly string[]): {
|
|
117
|
+
rows: ScopeGridRow[];
|
|
118
|
+
other: string[];
|
|
119
|
+
} | null;
|
package/dist/api-keys.js
CHANGED
|
@@ -5,6 +5,8 @@ exports.listApiKeys = listApiKeys;
|
|
|
5
5
|
exports.createApiKey = createApiKey;
|
|
6
6
|
exports.updateApiKey = updateApiKey;
|
|
7
7
|
exports.revokeApiKey = revokeApiKey;
|
|
8
|
+
exports.impliedScopes = impliedScopes;
|
|
9
|
+
exports.scopeGrid = scopeGrid;
|
|
8
10
|
/** A refused request. `code` is the server's stable error code. */
|
|
9
11
|
class ApiKeyRequestError extends Error {
|
|
10
12
|
code;
|
|
@@ -54,6 +56,7 @@ async function listApiKeys(client, options = {}) {
|
|
|
54
56
|
data: body.data ?? [],
|
|
55
57
|
allowedScopes: body.allowed_scopes ?? [],
|
|
56
58
|
allowedClaims: body.allowed_claims ?? [],
|
|
59
|
+
scopeImplications: body.scope_implications ?? {},
|
|
57
60
|
maxActiveKeys: body.max_active_keys ?? 0,
|
|
58
61
|
activeCount: body.active_count ?? 0,
|
|
59
62
|
};
|
|
@@ -86,4 +89,52 @@ async function updateApiKey(client, id, input) {
|
|
|
86
89
|
async function revokeApiKey(client, id) {
|
|
87
90
|
return call(client, `${BASE}/${encodeURIComponent(id)}/revoke`, { method: 'POST' });
|
|
88
91
|
}
|
|
92
|
+
/**
|
|
93
|
+
* The scopes `selected` grants once the instance implications are applied (the
|
|
94
|
+
* same closure verify answers with as `effective_scopes`). `*` expands to every
|
|
95
|
+
* scope the instance names — `allowedScopes` plus both sides of the map.
|
|
96
|
+
*/
|
|
97
|
+
function impliedScopes(selected, implications, allowedScopes = []) {
|
|
98
|
+
const vocab = new Set(allowedScopes);
|
|
99
|
+
for (const [from, tos] of Object.entries(implications)) {
|
|
100
|
+
vocab.add(from);
|
|
101
|
+
for (const t of tos)
|
|
102
|
+
if (t !== '*')
|
|
103
|
+
vocab.add(t);
|
|
104
|
+
}
|
|
105
|
+
const out = new Set(selected);
|
|
106
|
+
const queue = [...selected];
|
|
107
|
+
while (queue.length > 0) {
|
|
108
|
+
for (const to of implications[queue.pop()] ?? []) {
|
|
109
|
+
for (const t of to === '*' ? vocab : [to]) {
|
|
110
|
+
if (!out.has(t)) {
|
|
111
|
+
out.add(t);
|
|
112
|
+
queue.push(t);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return [...out].sort();
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Lay a scope vocabulary out as a resource × read/write grid: every
|
|
121
|
+
* `<resource>:read` / `<resource>:write` scope becomes a row, anything else
|
|
122
|
+
* (`admin`, `reports:export`) is returned in `other`. `null` when no scope fits
|
|
123
|
+
* the grid, so a UI falls back to a flat checkbox list.
|
|
124
|
+
*/
|
|
125
|
+
function scopeGrid(allowedScopes) {
|
|
126
|
+
const rows = new Map();
|
|
127
|
+
const other = [];
|
|
128
|
+
for (const scope of allowedScopes) {
|
|
129
|
+
const m = /^(.+):(read|write)$/.exec(scope);
|
|
130
|
+
if (!m) {
|
|
131
|
+
other.push(scope);
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
const row = rows.get(m[1]) ?? { resource: m[1] };
|
|
135
|
+
row[m[2]] = scope;
|
|
136
|
+
rows.set(m[1], row);
|
|
137
|
+
}
|
|
138
|
+
return rows.size > 0 ? { rows: [...rows.values()], other } : null;
|
|
139
|
+
}
|
|
89
140
|
//# sourceMappingURL=api-keys.js.map
|
package/dist/api-keys.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-keys.js","sourceRoot":"","sources":["../src/api-keys.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"api-keys.js","sourceRoot":"","sources":["../src/api-keys.ts"],"names":[],"mappings":"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"}
|
package/dist/avatar.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { FapiClient } from './fapi';
|
|
2
|
+
export type AvatarResult = {
|
|
3
|
+
ok: true;
|
|
4
|
+
user: Record<string, unknown>;
|
|
5
|
+
} | {
|
|
6
|
+
ok: false;
|
|
7
|
+
errors: Array<{
|
|
8
|
+
code?: string;
|
|
9
|
+
message: string;
|
|
10
|
+
}>;
|
|
11
|
+
};
|
|
12
|
+
/** Image types the server accepts for a profile picture (5 MB max). */
|
|
13
|
+
export declare const AVATAR_TYPES: readonly ["image/png", "image/jpeg", "image/gif", "image/webp"];
|
|
14
|
+
/**
|
|
15
|
+
* Upload the signed-in user's profile picture (a File or Blob from an
|
|
16
|
+
* `<input type="file">`). Replaces the current one; answers with the updated user.
|
|
17
|
+
*/
|
|
18
|
+
export declare function setAvatar(client: FapiClient, file: Blob): Promise<AvatarResult>;
|
|
19
|
+
/** Remove the signed-in user's profile picture. Answers with the updated user. */
|
|
20
|
+
export declare function removeAvatar(client: FapiClient): Promise<AvatarResult>;
|
package/dist/avatar.js
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AVATAR_TYPES = void 0;
|
|
4
|
+
exports.setAvatar = setAvatar;
|
|
5
|
+
exports.removeAvatar = removeAvatar;
|
|
6
|
+
/** Image types the server accepts for a profile picture (5 MB max). */
|
|
7
|
+
exports.AVATAR_TYPES = ['image/png', 'image/jpeg', 'image/gif', 'image/webp'];
|
|
8
|
+
/**
|
|
9
|
+
* Upload the signed-in user's profile picture (a File or Blob from an
|
|
10
|
+
* `<input type="file">`). Replaces the current one; answers with the updated user.
|
|
11
|
+
*/
|
|
12
|
+
async function setAvatar(client, file) {
|
|
13
|
+
const type = file.type || 'application/octet-stream';
|
|
14
|
+
if (!exports.AVATAR_TYPES.includes(type)) {
|
|
15
|
+
return { ok: false, errors: [{ code: 'unsupported_media_type', message: `Use a PNG, JPEG, GIF or WebP image (got ${type}).` }] };
|
|
16
|
+
}
|
|
17
|
+
const res = await client.request('/v1/client/me/avatar', { method: 'POST', body: file, headers: { 'content-type': type } });
|
|
18
|
+
return res.ok && res.data ? { ok: true, user: res.data } : { ok: false, errors: res.errors };
|
|
19
|
+
}
|
|
20
|
+
/** Remove the signed-in user's profile picture. Answers with the updated user. */
|
|
21
|
+
async function removeAvatar(client) {
|
|
22
|
+
const res = await client.request('/v1/client/me/avatar', { method: 'DELETE' });
|
|
23
|
+
return res.ok && res.data ? { ok: true, user: res.data } : { ok: false, errors: res.errors };
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=avatar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"avatar.js","sourceRoot":"","sources":["../src/avatar.ts"],"names":[],"mappings":";;;AAWA,8BAOC;AAGD,oCAGC;AApBD,uEAAuE;AAC1D,QAAA,YAAY,GAAG,CAAC,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,CAAU,CAAC;AAE5F;;;GAGG;AACI,KAAK,UAAU,SAAS,CAAC,MAAkB,EAAE,IAAU;IAC5D,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,0BAA0B,CAAC;IACrD,IAAI,CAAE,oBAAkC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACxD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,wBAAwB,EAAE,OAAO,EAAE,2CAA2C,IAAI,IAAI,EAAE,CAAC,EAAE,CAAC;IACnI,CAAC;IACD,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,OAAO,CAA0B,sBAAsB,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;IACrJ,OAAO,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC;AAC/F,CAAC;AAED,kFAAkF;AAC3E,KAAK,UAAU,YAAY,CAAC,MAAkB;IACnD,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,OAAO,CAA0B,sBAAsB,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;IACxG,OAAO,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC;AAC/F,CAAC"}
|
package/dist/dev-browser.d.ts
CHANGED
|
@@ -36,4 +36,6 @@ export declare function devBrowserEnabled(publishableKey: string): boolean;
|
|
|
36
36
|
export declare function devBrowserToken(publishableKey: string): string | null;
|
|
37
37
|
/** Forget the stored refresh token (sign-out; tests). */
|
|
38
38
|
export declare function forgetDevBrowserToken(publishableKey: string): void;
|
|
39
|
+
/** Test hook: forget shared exchanges. */
|
|
40
|
+
export declare function resetSharedExchanges(): void;
|
|
39
41
|
export declare function withDevBrowser(publishableKey: string, fetchImpl: typeof fetch): typeof fetch;
|
package/dist/dev-browser.js
CHANGED
|
@@ -28,6 +28,7 @@ exports.getPersistence = getPersistence;
|
|
|
28
28
|
exports.devBrowserEnabled = devBrowserEnabled;
|
|
29
29
|
exports.devBrowserToken = devBrowserToken;
|
|
30
30
|
exports.forgetDevBrowserToken = forgetDevBrowserToken;
|
|
31
|
+
exports.resetSharedExchanges = resetSharedExchanges;
|
|
31
32
|
exports.withDevBrowser = withDevBrowser;
|
|
32
33
|
const STORAGE_PREFIX = '__atlas_dev_session:';
|
|
33
34
|
const EXCHANGE = '/v1/client/tickets/exchange';
|
|
@@ -133,11 +134,72 @@ async function bodyOf(response) {
|
|
|
133
134
|
* unchanged for a production key or where there is no storage.
|
|
134
135
|
*/
|
|
135
136
|
const WRAPPED = Symbol.for('atlas.devBrowser');
|
|
137
|
+
/**
|
|
138
|
+
* One in-flight ticket exchange per ticket, page-wide.
|
|
139
|
+
*
|
|
140
|
+
* A page whose effects run twice (React StrictMode in development, a remounted
|
|
141
|
+
* provider) would POST the same one-time ticket twice; the second call would
|
|
142
|
+
* fail with 400 and log a console error although the sign-in worked. Every
|
|
143
|
+
* caller of `POST /v1/client/tickets/exchange` for the same attempt + ticket
|
|
144
|
+
* shares the first request, and each gets its own copy of the response. A
|
|
145
|
+
* finished exchange is kept for {@link EXCHANGE_SHARE_MS} so a remount just
|
|
146
|
+
* after it still reuses the answer instead of spending the ticket again.
|
|
147
|
+
* Shares are kept per underlying fetch: a remount wrapping the same fetch shares,
|
|
148
|
+
* a different fetch (another client, a test's fresh mock) never sees them.
|
|
149
|
+
*/
|
|
150
|
+
const EXCHANGE_SHARE_MS = 10_000;
|
|
151
|
+
let exchangesByFetch = new WeakMap();
|
|
152
|
+
function exchangeKey(init) {
|
|
153
|
+
if (typeof init?.body !== 'string')
|
|
154
|
+
return null;
|
|
155
|
+
try {
|
|
156
|
+
const body = JSON.parse(init.body);
|
|
157
|
+
return typeof body.attempt_id === 'string' && typeof body.ticket === 'string' ? `${body.attempt_id}\0${body.ticket}` : null;
|
|
158
|
+
}
|
|
159
|
+
catch {
|
|
160
|
+
return null;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
function sharedExchange(owner, input, init, send) {
|
|
164
|
+
const key = (init?.method ?? 'GET').toUpperCase() === 'POST' && pathOf(input) === EXCHANGE ? exchangeKey(init) : null;
|
|
165
|
+
if (!key)
|
|
166
|
+
return send();
|
|
167
|
+
const shares = exchangesByFetch.get(owner) ?? new Map();
|
|
168
|
+
exchangesByFetch.set(owner, shares);
|
|
169
|
+
let first = shares.get(key);
|
|
170
|
+
if (!first) {
|
|
171
|
+
first = send();
|
|
172
|
+
shares.set(key, first);
|
|
173
|
+
const forget = () => {
|
|
174
|
+
if (shares.get(key) === first)
|
|
175
|
+
shares.delete(key);
|
|
176
|
+
};
|
|
177
|
+
// A failed exchange is not shared later (a retry should really retry); a success is, briefly.
|
|
178
|
+
first.then((r) => {
|
|
179
|
+
if (!r.ok)
|
|
180
|
+
return forget();
|
|
181
|
+
const timer = setTimeout(forget, EXCHANGE_SHARE_MS);
|
|
182
|
+
timer.unref?.();
|
|
183
|
+
}, forget);
|
|
184
|
+
}
|
|
185
|
+
return first.then((r) => r.clone());
|
|
186
|
+
}
|
|
187
|
+
/** Test hook: forget shared exchanges. */
|
|
188
|
+
function resetSharedExchanges() {
|
|
189
|
+
exchangesByFetch = new WeakMap();
|
|
190
|
+
}
|
|
136
191
|
function withDevBrowser(publishableKey, fetchImpl) {
|
|
137
192
|
// A provider hands its (already wrapped) fetch to the FAPI client too: wrap once.
|
|
138
|
-
if (
|
|
193
|
+
if (fetchImpl[WRAPPED])
|
|
139
194
|
return fetchImpl;
|
|
140
|
-
|
|
195
|
+
if (!publishableKey.startsWith('pk_test_')) {
|
|
196
|
+
// Production keys: only the one-exchange-per-ticket share.
|
|
197
|
+
const shared = (input, init) => sharedExchange(fetchImpl, input, init, () => fetchImpl(input, init));
|
|
198
|
+
shared[WRAPPED] = true;
|
|
199
|
+
return shared;
|
|
200
|
+
}
|
|
201
|
+
const wrapped = (input, init) => sharedExchange(fetchImpl, input, init, () => devBrowserFetch(input, init));
|
|
202
|
+
const devBrowserFetch = async (input, init) => {
|
|
141
203
|
if (!devBrowserEnabled(publishableKey))
|
|
142
204
|
return fetchImpl(input, init);
|
|
143
205
|
const path = pathOf(input);
|
package/dist/dev-browser.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev-browser.js","sourceRoot":"","sources":["../src/dev-browser.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;;AA0BH,wCAEC;AAGD,wCAEC;AAcD,8CAEC;AAGD,0CAMC;AAuBD,sDAOC;
|
|
1
|
+
{"version":3,"file":"dev-browser.js","sourceRoot":"","sources":["../src/dev-browser.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;;AA0BH,wCAEC;AAGD,wCAEC;AAcD,8CAEC;AAGD,0CAMC;AAuBD,sDAOC;AAyFD,oDAEC;AAED,wCAwDC;AA3OD,MAAM,cAAc,GAAG,sBAAsB,CAAC;AAC9C,MAAM,QAAQ,GAAG,6BAA6B,CAAC;AAC/C,MAAM,IAAI,GAAG,YAAY,CAAC;AAC1B,MAAM,OAAO,GAAG,yCAAyC,CAAC;AAC1D,MAAM,MAAM,GAAG,yCAAyC,CAAC;AAUzD,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;AACzC,MAAM,WAAW,GAAU;IACzB,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI;IACrC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;IACxC,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;CACzC,CAAC;AAEF,IAAI,IAAI,GAAoB,OAAO,CAAC;AAEpC,gGAAgG;AAChG,SAAgB,cAAc,CAAC,IAAiC;IAC9D,IAAI,GAAG,IAAI,IAAI,OAAO,CAAC;AACzB,CAAC;AAED,oEAAoE;AACpE,SAAgB,cAAc;IAC5B,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,OAAO;IACd,IAAI,IAAI,KAAK,QAAQ;QAAE,OAAO,WAAW,CAAC;IAC1C,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,UAA8D,CAAC;QACzE,MAAM,CAAC,GAAG,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC;QACjE,OAAO,CAAC,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACzD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,gGAAgG;AAChG,SAAgB,iBAAiB,CAAC,cAAsB;IACtD,OAAO,cAAc,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,OAAO,EAAE,KAAK,IAAI,CAAC;AACrE,CAAC;AAED,oEAAoE;AACpE,SAAgB,eAAe,CAAC,cAAsB;IACpD,IAAI,CAAC;QACH,OAAO,OAAO,EAAE,EAAE,OAAO,CAAC,cAAc,GAAG,cAAc,CAAC,IAAI,IAAI,CAAC;IACrE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,cAAc,GAAG,MAAM,CAAC;AAE9B,SAAS,QAAQ,CAAC,cAAsB,EAAE,KAAc,EAAE,SAAkB;IAC1E,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK;QAAE,OAAO;IAChD,IAAI,CAAC;QACH,OAAO,EAAE,EAAE,OAAO,CAAC,cAAc,GAAG,cAAc,EAAE,KAAK,CAAC,CAAC;QAC3D,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS;YAAE,OAAO,EAAE,EAAE,OAAO,CAAC,cAAc,GAAG,cAAc,GAAG,cAAc,EAAE,SAAS,CAAC,CAAC;IAClI,CAAC;IAAC,MAAM,CAAC;QACP,oFAAoF;IACtF,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,cAAsB;IAC7C,IAAI,CAAC;QACH,OAAO,OAAO,EAAE,EAAE,OAAO,CAAC,cAAc,GAAG,cAAc,GAAG,cAAc,CAAC,IAAI,IAAI,CAAC;IACtF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,yDAAyD;AACzD,SAAgB,qBAAqB,CAAC,cAAsB;IAC1D,IAAI,CAAC;QACH,OAAO,EAAE,EAAE,UAAU,CAAC,cAAc,GAAG,cAAc,CAAC,CAAC;QACvD,OAAO,EAAE,EAAE,UAAU,CAAC,cAAc,GAAG,cAAc,GAAG,cAAc,CAAC,CAAC;IAC1E,CAAC;IAAC,MAAM,CAAC;QACP,oBAAoB;IACtB,CAAC;AACH,CAAC;AAED,SAAS,MAAM,CAAC,KAAwB;IACtC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,YAAY,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC;QAC9F,OAAO,IAAI,GAAG,CAAC,GAAG,EAAE,yBAAyB,CAAC,CAAC,QAAQ,CAAC;IAC1D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,qDAAqD;AACrD,SAAS,WAAW,CAAC,IAAY;IAC/B,MAAM,CAAC,GAAG,oCAAoC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1D,OAAO,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC9C,CAAC;AAED,KAAK,UAAU,MAAM,CAAC,QAAkB;IACtC,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,CAAC,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,CAAY,CAAC;QACrD,OAAO,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,CAA6B,CAAC,CAAC,CAAC,IAAI,CAAC;IACjG,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;AAE/C;;;;;;;;;;;;GAYG;AACH,MAAM,iBAAiB,GAAG,MAAM,CAAC;AACjC,IAAI,gBAAgB,GAAG,IAAI,OAAO,EAA0C,CAAC;AAE7E,SAAS,WAAW,CAAC,IAA6B;IAChD,IAAI,OAAO,IAAI,EAAE,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAChD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAA+C,CAAC;QACjF,OAAO,OAAO,IAAI,CAAC,UAAU,KAAK,QAAQ,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,UAAU,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAC9H,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CACrB,KAAmB,EACnB,KAAwB,EACxB,IAA6B,EAC7B,IAA6B;IAE7B,MAAM,GAAG,GAAG,CAAC,IAAI,EAAE,MAAM,IAAI,KAAK,CAAC,CAAC,WAAW,EAAE,KAAK,MAAM,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACtH,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,EAAE,CAAC;IACxB,MAAM,MAAM,GAAG,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,GAAG,EAA6B,CAAC;IACnF,gBAAgB,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACpC,IAAI,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC5B,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,KAAK,GAAG,IAAI,EAAE,CAAC;QACf,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACvB,MAAM,MAAM,GAAG,GAAG,EAAE;YAClB,IAAI,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,KAAK;gBAAE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACpD,CAAC,CAAC;QACF,8FAA8F;QAC9F,KAAK,CAAC,IAAI,CACR,CAAC,CAAC,EAAE,EAAE;YACJ,IAAI,CAAC,CAAC,CAAC,EAAE;gBAAE,OAAO,MAAM,EAAE,CAAC;YAC3B,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;YACnD,KAAgC,CAAC,KAAK,EAAE,EAAE,CAAC;QAC9C,CAAC,EACD,MAAM,CACP,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;AACtC,CAAC;AAED,0CAA0C;AAC1C,SAAgB,oBAAoB;IAClC,gBAAgB,GAAG,IAAI,OAAO,EAAE,CAAC;AACnC,CAAC;AAED,SAAgB,cAAc,CAAC,cAAsB,EAAE,SAAuB;IAC5E,kFAAkF;IAClF,IAAK,SAAgD,CAAC,OAAO,CAAC;QAAE,OAAO,SAAS,CAAC;IACjF,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3C,2DAA2D;QAC3D,MAAM,MAAM,GAAG,CAAC,KAAwB,EAAE,IAAkB,EAAE,EAAE,CAAC,cAAc,CAAC,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;QACrI,MAA6C,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;QAC/D,OAAO,MAAsB,CAAC;IAChC,CAAC;IACD,MAAM,OAAO,GAAG,CAAC,KAAwB,EAAE,IAAkB,EAAqB,EAAE,CAClF,cAAc,CAAC,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;IAC7E,MAAM,eAAe,GAAG,KAAK,EAAE,KAAwB,EAAE,IAAkB,EAAqB,EAAE;QAChG,IAAI,CAAC,iBAAiB,CAAC,cAAc,CAAC;YAAE,OAAO,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACtE,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC3B,MAAM,MAAM,GAAG,CAAC,IAAI,EAAE,MAAM,IAAI,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;QACrD,IAAI,QAAQ,GAAG,IAAI,CAAC;QACpB,IAAI,SAAS,GAAG,KAAK,CAAC;QAEtB,IAAI,IAAI,KAAK,QAAQ,IAAI,MAAM,KAAK,MAAM,IAAI,OAAO,IAAI,EAAE,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC7E,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAY,CAAC;gBAC9C,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC7D,QAAQ,GAAG,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,GAAI,IAAgC,EAAE,oBAAoB,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;gBACrH,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,6BAA6B;YAC/B,CAAC;QACH,CAAC;QACD,MAAM,KAAK,GAAG,eAAe,CAAC,cAAc,CAAC,CAAC;QAC9C,IAAI,KAAK,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,IAAI,MAAM,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC;YACxG,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAC/C,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;gBAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC;YAC3E,QAAQ,GAAG,EAAE,GAAG,QAAQ,EAAE,OAAO,EAAE,CAAC;YACpC,SAAS,GAAG,IAAI,CAAC;QACnB,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QAClD,IAAI,CAAC,IAAI;YAAE,OAAO,QAAQ,CAAC;QAC3B,IAAI,IAAI,KAAK,QAAQ,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;YACrC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;YACpC,QAAQ,CAAC,cAAc,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;QAC1D,CAAC;aAAM,IAAI,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACtC,IAAI,QAAQ,CAAC,EAAE;gBAAE,QAAQ,CAAC,cAAc,EAAE,CAAC,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,aAAa,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;iBACjG,IAAI,SAAS,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG;gBAAE,qBAAqB,CAAC,cAAc,CAAC,CAAC;QACvF,CAAC;aAAM,IAAI,IAAI,KAAK,IAAI,IAAI,SAAS,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;YACrD,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;YACpC,IAAI,IAAI,IAAI,IAAI,CAAC,OAAO,KAAK,IAAI;gBAAE,qBAAqB,CAAC,cAAc,CAAC,CAAC;QAC3E,CAAC;aAAM,IAAI,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,CAAC,EAAE,CAAC;YACjF,+EAA+E;YAC/E,MAAM,GAAG,GAAG,eAAe,CAAC,cAAc,CAAC,CAAC;YAC5C,IAAI,CAAC,GAAG,IAAI,GAAG,KAAK,WAAW,CAAC,IAAI,CAAC;gBAAE,qBAAqB,CAAC,cAAc,CAAC,CAAC;QAC/E,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC,CAAC;IACD,OAA8C,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;IAChE,OAAO,OAAuB,CAAC;AACjC,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -53,6 +53,7 @@ export * from './email-addresses';
|
|
|
53
53
|
export * from './account-hints';
|
|
54
54
|
export * from './custom-challenge';
|
|
55
55
|
export * from './identity-verification';
|
|
56
|
+
export * from './avatar';
|
|
56
57
|
export * from './iga';
|
|
57
58
|
export * from './resource-sharing';
|
|
58
59
|
export * from './profile';
|
package/dist/index.js
CHANGED
|
@@ -104,6 +104,7 @@ __exportStar(require("./account-hints"), exports);
|
|
|
104
104
|
__exportStar(require("./custom-challenge"), exports);
|
|
105
105
|
// Identity verification (document and selfie) through the app's verification service.
|
|
106
106
|
__exportStar(require("./identity-verification"), exports);
|
|
107
|
+
__exportStar(require("./avatar"), exports);
|
|
107
108
|
// Identity governance: request access, approve, review, delegate.
|
|
108
109
|
__exportStar(require("./iga"), exports);
|
|
109
110
|
__exportStar(require("./resource-sharing"), exports);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,6EAA6E;AAC7E,2CAAyB;AACzB,6CAA2B;AAC3B,yDAAyD;AACzD,kDAAgC;AAChC,sFAAsF;AACtF,mDAAiC;AACjC,gDAA8B;AAC9B,iDAA+B;AAC/B,4CAA0B;AAC1B,iDAA+B;AAC/B,kDAAgC;AAChC,uEAAuE;AACvE,2CAAyB;AACzB,6CAA2B;AAC3B,qFAAqF;AACrF,kDAAgC;AAChC,yCAAuB;AACvB,uEAAuE;AACvE,6CAA2B;AAC3B,mGAAmG;AACnG,2DAAyC;AACzC,4GAA4G;AAC5G,sDAAoC;AACpC,+CAA6B;AAC7B,+EAA+E;AAC/E,6CAA2B;AAC3B,8DAA4C;AAC5C,gGAAgG;AAChG,6CAAgJ;AAAvI,gHAAA,iBAAiB,OAAA;AAAE,8GAAA,eAAe,OAAA;AAAE,oHAAA,qBAAqB,OAAA;AAAE,6GAAA,cAAc,OAAA;AAAE,6GAAA,cAAc,OAAA;AAClG,qDAW2B;AAVzB,oHAAA,iBAAiB,OAAA;AACjB,2HAAA,wBAAwB,OAAA;AACxB,oHAAA,iBAAiB,OAAA;AACjB,gHAAA,aAAa,OAAA;AACb,wHAAA,qBAAqB,OAAA;AACrB,uHAAA,oBAAoB,OAAA;AAMtB,iEAAiE;AACjE,iDAA+B;AAC/B,4CAA0B;AAC1B,yFAAyF;AACzF,oDAAkC;AAClC,2CAAyB;AACzB,mDAAiC;AACjC,4CAA0B;AAC1B,2FAA2F;AAC3F,gDAA8B;AAC9B,+CAA6B;AAC7B,0GAA0G;AAC1G,mDAAiC;AACjC,iFAAiF;AACjF,gDAA8B;AAC9B,uFAAuF;AACvF,oDAAkC;AAClC,4EAA4E;AAC5E,oDAAkC;AAClC,sGAAsG;AACtG,qDAAmC;AACnC,6FAA6F;AAC7F,wCAAsB;AACtB,4CAA0B;AAC1B,6CAA2B;AAC3B,yCAAuB;AACvB,8CAA4B;AAC5B,2CAAyB;AACzB,4DAA4D;AAC5D,6CAA2B;AAC3B,kFAAkF;AAClF,oDAAkC;AAClC,yCAAuB;AACvB,yDAAuC;AACvC,iDAA+B;AAC/B,wDAAsC;AACtC,kDAAgC;AAChC,uDAAqC;AACrC,4CAA0B;AAC1B,8CAA4B;AAC5B,kDAAgC;AAChC,oDAAkC;AAClC,+DAA+D;AAC/D,kDAAgC;AAChC,qDAAmC;AACnC,sFAAsF;AACtF,0DAAwC;AACxC,kEAAkE;AAClE,wCAAsB;AACtB,qDAAmC;AACnC,qEAAqE;AACrE,4CAA0B;AAC1B,4CAA0B;AAC1B,gDAA8B;AAC9B,mDAAiC;AACjC,kDAAgC;AAChC,gGAAgG;AAChG,uDAAqC;AACrC,+DAA6C;AAC7C,sDAAsD;AACtD,wDAAsC;AACtC,+EAA+E;AAC/E,oDAAkC;AAClC,+EAA+E;AAC/E,2EAA2E;AAC3E,4CAA0B;AAC1B,kFAAkF;AAClF,mDAAiC;AACjC,4FAA4F;AAC5F,kDAAgC;AAChC,kFAAkF;AAClF,yEAAyE;AACzE,oEAAoE;AACpE,uDAAqC;AACrC,sDAAoC;AACpC,uEAAuE;AACvE,gDAA8B;AAC9B,0EAA0E;AAC1E,4EAA4E;AAC5E,0CAa0B;AARxB,iGAAA,QAAQ,OAAA;AACR,sGAAA,aAAa,OAAA;AACb,0GAAA,iBAAiB,OAAA;AACjB,uGAAA,cAAc,OAAA;AACd,yGAAA,gBAAgB,OAAA;AAChB,+GAAA,sBAAsB,OAAA;AACtB,kGAAA,SAAS,OAAA;AACT,wGAAA,eAAe,OAAA;AAEjB,qDAAmC;AAEnC,yGAAyG;AACzG,iDAA+B;AAE/B,kFAAkF;AAClF,sDAAoC;AAEpC,2FAA2F;AAC3F,gDAA8B;AAC9B,wCAAsB"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -34,6 +34,20 @@ export interface InstanceSettings {
|
|
|
34
34
|
* `username` entry is already in {@link signUpFields}.
|
|
35
35
|
*/
|
|
36
36
|
account: AccountUx;
|
|
37
|
+
/**
|
|
38
|
+
* "Sign in with Atlas" when the instance has it on (`sign_in_with_atlas` in
|
|
39
|
+
* `/v1/appearance`): the SSO connection a "Continue with Atlas" button starts
|
|
40
|
+
* with {@link startSignInWithAtlas}. Absent when it is off.
|
|
41
|
+
*/
|
|
42
|
+
signInWithAtlas?: {
|
|
43
|
+
connectionId: string;
|
|
44
|
+
};
|
|
45
|
+
/**
|
|
46
|
+
* Passkey sign-in is on (`strategies.passkey`): the sign-in form offers
|
|
47
|
+
* "Sign in with a passkey" and passkey autofill on the identifier field, where
|
|
48
|
+
* the browser supports WebAuthn. False on an older server that does not say.
|
|
49
|
+
*/
|
|
50
|
+
passkeySignIn?: boolean;
|
|
37
51
|
}
|
|
38
52
|
/** One configurable sign-up field, exactly as `/v1/appearance` resolves it. */
|
|
39
53
|
export interface PublicSignUpField {
|
|
@@ -51,6 +65,17 @@ export interface PublicSignUpField {
|
|
|
51
65
|
* components behave exactly as they did before these settings existed.
|
|
52
66
|
*/
|
|
53
67
|
export declare function instanceSettingsFrom(body: unknown): InstanceSettings;
|
|
68
|
+
/**
|
|
69
|
+
* Start "Sign in with Atlas": `POST /v1/client/sign_ins/sso` for the instance's
|
|
70
|
+
* Atlas connection, returning the authorization URL to send the browser to (it
|
|
71
|
+
* comes back to `redirectUrl` signed in). Resolves `{ error }` with the server's
|
|
72
|
+
* message when it cannot start.
|
|
73
|
+
*/
|
|
74
|
+
export declare function startSignInWithAtlas(client: FapiClient, connectionId: string, redirectUrl: string): Promise<{
|
|
75
|
+
url: string;
|
|
76
|
+
} | {
|
|
77
|
+
error: string;
|
|
78
|
+
}>;
|
|
54
79
|
/**
|
|
55
80
|
* Fetch the instance's public settings (`GET /v1/appearance`). Null when the
|
|
56
81
|
* server can't be reached or answers with an error — the components then fall
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.instanceSettingsFrom = instanceSettingsFrom;
|
|
4
|
+
exports.startSignInWithAtlas = startSignInWithAtlas;
|
|
4
5
|
exports.fetchInstanceSettings = fetchInstanceSettings;
|
|
5
6
|
exports.toSignUpInput = toSignUpInput;
|
|
6
7
|
exports.withReferralChallenge = withReferralChallenge;
|
|
@@ -62,7 +63,41 @@ function instanceSettingsFrom(body) {
|
|
|
62
63
|
builtin: true,
|
|
63
64
|
});
|
|
64
65
|
}
|
|
65
|
-
|
|
66
|
+
const strategies = isRecord(root.strategies) ? root.strategies : {};
|
|
67
|
+
const atlas = isRecord(root.sign_in_with_atlas) ? root.sign_in_with_atlas : null;
|
|
68
|
+
const signInWithAtlas = atlas && atlas.enabled === true && typeof atlas.connection_id === 'string' && atlas.connection_id
|
|
69
|
+
? { connectionId: atlas.connection_id }
|
|
70
|
+
: undefined;
|
|
71
|
+
return {
|
|
72
|
+
captchaFlows,
|
|
73
|
+
signUpFields,
|
|
74
|
+
legal,
|
|
75
|
+
emailDelivery: (0, environment_1.emailDeliveryFrom)(root),
|
|
76
|
+
account,
|
|
77
|
+
passkeySignIn: strategies.passkey === true,
|
|
78
|
+
...(signInWithAtlas ? { signInWithAtlas } : {}),
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Start "Sign in with Atlas": `POST /v1/client/sign_ins/sso` for the instance's
|
|
83
|
+
* Atlas connection, returning the authorization URL to send the browser to (it
|
|
84
|
+
* comes back to `redirectUrl` signed in). Resolves `{ error }` with the server's
|
|
85
|
+
* message when it cannot start.
|
|
86
|
+
*/
|
|
87
|
+
async function startSignInWithAtlas(client, connectionId, redirectUrl) {
|
|
88
|
+
try {
|
|
89
|
+
const res = await client.post('/v1/client/sign_ins/sso', {
|
|
90
|
+
connection_id: connectionId,
|
|
91
|
+
redirect_url: redirectUrl,
|
|
92
|
+
});
|
|
93
|
+
const url = res.data?.authorization_url;
|
|
94
|
+
if (res.ok && url)
|
|
95
|
+
return { url };
|
|
96
|
+
return { error: res.errors?.[0]?.message ?? 'Could not start Sign in with Atlas.' };
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
return { error: 'Could not start Sign in with Atlas.' };
|
|
100
|
+
}
|
|
66
101
|
}
|
|
67
102
|
/**
|
|
68
103
|
* Fetch the instance's public settings (`GET /v1/appearance`). Null when the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instance-settings.js","sourceRoot":"","sources":["../src/instance-settings.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"instance-settings.js","sourceRoot":"","sources":["../src/instance-settings.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@ import type { FapiClient } from './fapi';
|
|
|
3
3
|
* The org-admin Frontend API behind the in-app admin widgets
|
|
4
4
|
* (`<OrganizationSsoConnection/>`, `<OrganizationDirectory/>`,
|
|
5
5
|
* `<OrganizationDomains/>`, `<OrganizationLogStreams/>`, `<OrganizationApiKeys/>`,
|
|
6
|
-
* `<OrganizationIpAllowlist/>`, `<OrganizationWebhooks/>`). Every call is scoped
|
|
6
|
+
* `<OrganizationIpAllowlist/>`, `<OrganizationWebhooks/>`, `<AppWebhookEndpoints/>`). Every call is scoped
|
|
7
7
|
* to the ACTIVE organization and needs the manage-members permission; a refused
|
|
8
8
|
* call throws {@link OrganizationRequestError} (404 for another organization,
|
|
9
9
|
* 403 for a member without the permission).
|
|
@@ -117,6 +117,19 @@ export interface OrganizationWebhookDelivery {
|
|
|
117
117
|
attempt_number: number;
|
|
118
118
|
created_at: number;
|
|
119
119
|
}
|
|
120
|
+
export interface OrganizationAppEventType {
|
|
121
|
+
object: 'app_event_type';
|
|
122
|
+
id: string;
|
|
123
|
+
type: string;
|
|
124
|
+
description: string | null;
|
|
125
|
+
}
|
|
126
|
+
export interface OrganizationWebhookTestResult {
|
|
127
|
+
object: 'webhook_test_result';
|
|
128
|
+
delivery_id: string;
|
|
129
|
+
status: 'success' | 'failed';
|
|
130
|
+
http_status: number | null;
|
|
131
|
+
error: string | null;
|
|
132
|
+
}
|
|
120
133
|
export declare const organizationAdmin: {
|
|
121
134
|
getSso: (c: FapiClient, org: string) => Promise<OrganizationSsoView>;
|
|
122
135
|
saveSso: (c: FapiClient, org: string, input: OrganizationSsoInput) => Promise<OrganizationSsoView>;
|
|
@@ -189,4 +202,45 @@ export declare const organizationAdmin: {
|
|
|
189
202
|
overlap_seconds: number;
|
|
190
203
|
}>;
|
|
191
204
|
webhookDeliveries: (c: FapiClient, org: string, endpointId: string) => Promise<OrganizationWebhookDelivery[]>;
|
|
205
|
+
/** The app's event catalog for the picker (deprecated types left out). */
|
|
206
|
+
listAppEventTypes: (c: FapiClient, org: string) => Promise<OrganizationAppEventType[]>;
|
|
207
|
+
listAppWebhooks: (c: FapiClient, org: string) => Promise<OrganizationWebhookEndpoint[]>;
|
|
208
|
+
/** The returned `whsec_` secret is shown once (or with `revealAppWebhookSecret`). */
|
|
209
|
+
createAppWebhook: (c: FapiClient, org: string, input: {
|
|
210
|
+
url: string;
|
|
211
|
+
enabled_events?: string[];
|
|
212
|
+
description?: string;
|
|
213
|
+
}) => Promise<OrganizationWebhookEndpoint & {
|
|
214
|
+
secret: string;
|
|
215
|
+
}>;
|
|
216
|
+
updateAppWebhook: (c: FapiClient, org: string, endpointId: string, input: {
|
|
217
|
+
url?: string;
|
|
218
|
+
enabled_events?: string[];
|
|
219
|
+
description?: string | null;
|
|
220
|
+
active?: boolean;
|
|
221
|
+
}) => Promise<OrganizationWebhookEndpoint>;
|
|
222
|
+
deleteAppWebhook: (c: FapiClient, org: string, endpointId: string) => Promise<{
|
|
223
|
+
id: string;
|
|
224
|
+
deleted: true;
|
|
225
|
+
}>;
|
|
226
|
+
revealAppWebhookSecret: (c: FapiClient, org: string, endpointId: string) => Promise<{
|
|
227
|
+
secret: string;
|
|
228
|
+
}>;
|
|
229
|
+
rotateAppWebhookSecret: (c: FapiClient, org: string, endpointId: string) => Promise<{
|
|
230
|
+
secret: string;
|
|
231
|
+
overlap_seconds: number;
|
|
232
|
+
}>;
|
|
233
|
+
/** Sends a signed `webhook.test` now and returns the attempt (status, http_status, error). */
|
|
234
|
+
testAppWebhook: (c: FapiClient, org: string, endpointId: string) => Promise<OrganizationWebhookTestResult>;
|
|
235
|
+
appWebhookDeliveries: (c: FapiClient, org: string, endpointId: string) => Promise<OrganizationWebhookDelivery[]>;
|
|
236
|
+
redeliverAppWebhook: (c: FapiClient, org: string, endpointId: string, deliveryId: string) => Promise<{
|
|
237
|
+
id: string;
|
|
238
|
+
event_id: string;
|
|
239
|
+
status: string;
|
|
240
|
+
}>;
|
|
241
|
+
/** Re-send what the endpoint missed since it started failing (after re-enabling it). */
|
|
242
|
+
replayAppWebhook: (c: FapiClient, org: string, endpointId: string, since?: number | "failing_since") => Promise<{
|
|
243
|
+
queued: number;
|
|
244
|
+
has_more: boolean;
|
|
245
|
+
}>;
|
|
192
246
|
};
|
|
@@ -49,5 +49,21 @@ exports.organizationAdmin = {
|
|
|
49
49
|
deleteWebhook: (c, org, endpointId) => call(c, `${base(org)}/webhook_endpoints/${enc(endpointId)}`, send('DELETE')),
|
|
50
50
|
rotateWebhookSecret: (c, org, endpointId) => call(c, `${base(org)}/webhook_endpoints/${enc(endpointId)}/rotate_secret`, send('POST')),
|
|
51
51
|
webhookDeliveries: async (c, org, endpointId) => (await call(c, `${base(org)}/webhook_endpoints/${enc(endpointId)}/deliveries`, send('GET'))).data,
|
|
52
|
+
/* Application webhooks: the app's own events, sent to this organization's endpoints (Standard Webhooks signed) */
|
|
53
|
+
/** The app's event catalog for the picker (deprecated types left out). */
|
|
54
|
+
listAppEventTypes: async (c, org) => (await call(c, `${base(org)}/app_event_types`, send('GET'))).data,
|
|
55
|
+
listAppWebhooks: async (c, org) => (await call(c, `${base(org)}/app_webhook_endpoints`, send('GET'))).data,
|
|
56
|
+
/** The returned `whsec_` secret is shown once (or with `revealAppWebhookSecret`). */
|
|
57
|
+
createAppWebhook: (c, org, input) => call(c, `${base(org)}/app_webhook_endpoints`, send('POST', input)),
|
|
58
|
+
updateAppWebhook: (c, org, endpointId, input) => call(c, `${base(org)}/app_webhook_endpoints/${enc(endpointId)}`, send('PATCH', input)),
|
|
59
|
+
deleteAppWebhook: (c, org, endpointId) => call(c, `${base(org)}/app_webhook_endpoints/${enc(endpointId)}`, send('DELETE')),
|
|
60
|
+
revealAppWebhookSecret: (c, org, endpointId) => call(c, `${base(org)}/app_webhook_endpoints/${enc(endpointId)}/reveal_secret`, send('POST')),
|
|
61
|
+
rotateAppWebhookSecret: (c, org, endpointId) => call(c, `${base(org)}/app_webhook_endpoints/${enc(endpointId)}/rotate_secret`, send('POST')),
|
|
62
|
+
/** Sends a signed `webhook.test` now and returns the attempt (status, http_status, error). */
|
|
63
|
+
testAppWebhook: (c, org, endpointId) => call(c, `${base(org)}/app_webhook_endpoints/${enc(endpointId)}/test?wait=10s`, send('POST')),
|
|
64
|
+
appWebhookDeliveries: async (c, org, endpointId) => (await call(c, `${base(org)}/app_webhook_endpoints/${enc(endpointId)}/deliveries`, send('GET'))).data,
|
|
65
|
+
redeliverAppWebhook: (c, org, endpointId, deliveryId) => call(c, `${base(org)}/app_webhook_endpoints/${enc(endpointId)}/deliveries/${enc(deliveryId)}/redeliver`, send('POST')),
|
|
66
|
+
/** Re-send what the endpoint missed since it started failing (after re-enabling it). */
|
|
67
|
+
replayAppWebhook: (c, org, endpointId, since = 'failing_since') => call(c, `${base(org)}/app_webhook_endpoints/${enc(endpointId)}/replay`, send('POST', { since })),
|
|
52
68
|
};
|
|
53
69
|
//# sourceMappingURL=organization-admin.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"organization-admin.js","sourceRoot":"","sources":["../src/organization-admin.ts"],"names":[],"mappings":";;;AACA,mDAA2D;
|
|
1
|
+
{"version":3,"file":"organization-admin.js","sourceRoot":"","sources":["../src/organization-admin.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,20 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
*
|
|
4
|
-
* Passwordless passkey sign-in has no identifier step, so when the instance
|
|
5
|
-
* challenges every sign-in (the always-on sign-in captcha, or a force-challenge
|
|
6
|
-
* switch) `POST /v1/client/sign_ins/passkey/begin` is where the captcha is
|
|
7
|
-
* taken: the token rides in its body as `captcha_token`, and without one the
|
|
8
|
-
* server answers `400 CAPTCHA_REQUIRED` (or `CAPTCHA_FAILED` for a token it
|
|
9
|
-
* refused).
|
|
10
|
-
*
|
|
11
|
-
* {@link beginPasskeySignIn} asks the caller's token source first (it returns a
|
|
12
|
-
* token only when the client already knows one is needed, e.g. an always-on
|
|
13
|
-
* sign-in captcha), and on a captcha refusal asks once more for a FRESH token
|
|
14
|
-
* (tokens are single-use) and retries once. The caller still runs the browser
|
|
15
|
-
* ceremony (`getPasskeyAssertion`) and the `finish` POST.
|
|
16
|
-
*/
|
|
17
|
-
import type { FapiClient, FapiResponse } from './fapi';
|
|
1
|
+
import type { FapiClient, FapiResponse, FlowState } from './fapi';
|
|
2
|
+
import { type PasskeyExtensionOptions, type WebAuthnHost } from './passkey';
|
|
18
3
|
/** What a passkey begin's token source is asked for. */
|
|
19
4
|
export interface PasskeyCaptchaRequest {
|
|
20
5
|
/**
|
|
@@ -38,3 +23,74 @@ export declare const PASSKEY_SIGN_IN_BEGIN_PATH = "/v1/client/sign_ins/passkey/b
|
|
|
38
23
|
export declare function beginPasskeySignIn(client: FapiClient, opts?: {
|
|
39
24
|
captcha?: PasskeyCaptchaSource | null;
|
|
40
25
|
}): Promise<FapiResponse<Record<string, unknown>>>;
|
|
26
|
+
export declare const PASSKEY_SIGN_IN_FINISH_PATH = "/v1/client/sign_ins/passkey/finish";
|
|
27
|
+
/** Options for {@link signInWithPasskey}. */
|
|
28
|
+
export interface PasskeySignInOptions extends PasskeyExtensionOptions {
|
|
29
|
+
/** The sign-in captcha's token source, when the instance challenges sign-ins (see {@link beginPasskeySignIn}). */
|
|
30
|
+
captcha?: PasskeyCaptchaSource | null;
|
|
31
|
+
/** `conditional` for autofill UI (see {@link startConditionalPasskeySignIn}). */
|
|
32
|
+
mediation?: 'optional' | 'conditional';
|
|
33
|
+
signal?: AbortSignal;
|
|
34
|
+
host?: WebAuthnHost;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Usernameless passkey sign-in, start to finish: begin (with the captcha when
|
|
38
|
+
* the instance challenges sign-ins) → the browser ceremony → finish.
|
|
39
|
+
*
|
|
40
|
+
* The finish sets the session cookies itself, so a `complete` result carries no
|
|
41
|
+
* ticket to exchange: the caller re-boots, exactly as after any sign-in. A
|
|
42
|
+
* passkey that proved presence only, on an account that owes MFA, returns the
|
|
43
|
+
* attempt at its second-factor step instead; continue there like any sign-in.
|
|
44
|
+
* A cancelled browser prompt is a `PASSKEY_CANCELLED` error, never a throw.
|
|
45
|
+
* PRF outputs (`prf` / `onExtensionResults`) go to the app only, never to Atlas.
|
|
46
|
+
*/
|
|
47
|
+
export declare function signInWithPasskey(client: FapiClient, opts?: PasskeySignInOptions): Promise<FlowState>;
|
|
48
|
+
/**
|
|
49
|
+
* Conditional (autofill) passkey sign-in: when the browser supports conditional
|
|
50
|
+
* mediation, run a background passkey request so saved passkeys appear in the
|
|
51
|
+
* autofill of an input with `autocomplete="username webauthn"`. `onResult` gets
|
|
52
|
+
* the outcome only when the user picks a passkey; a cancelled or aborted
|
|
53
|
+
* request is silent. Abort `signal` the moment the user does anything else
|
|
54
|
+
* (submits the form, presses the passkey button). Resolves false when it was
|
|
55
|
+
* not armed (unsupported browser, or `skip`).
|
|
56
|
+
*
|
|
57
|
+
* No captcha: an instance that challenges every sign-in refuses the begin, and
|
|
58
|
+
* the autofill stays off quietly; the button and the email step take the
|
|
59
|
+
* challenge instead.
|
|
60
|
+
*/
|
|
61
|
+
export declare function startConditionalPasskeySignIn(client: FapiClient, opts: PasskeyExtensionOptions & {
|
|
62
|
+
signal: AbortSignal;
|
|
63
|
+
onResult: (next: FlowState) => void;
|
|
64
|
+
host?: WebAuthnHost;
|
|
65
|
+
}): Promise<boolean>;
|
|
66
|
+
/** The captcha a sign-in form holds: an always-on sign-in captcha's token rides in the passkey begin. */
|
|
67
|
+
export interface PasskeySignInCaptcha {
|
|
68
|
+
readonly needed: boolean;
|
|
69
|
+
getToken(): Promise<string | null>;
|
|
70
|
+
reset(): void;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* The passkey half of a prebuilt sign-in form, for the framework SDKs that draw
|
|
74
|
+
* their own UI (Vue, Svelte, Solid, Angular): `signIn()` for the
|
|
75
|
+
* "Sign in with a passkey" button, `armAutofill()` when the first step shows
|
|
76
|
+
* (conditional mediation for the `autocomplete="username webauthn"` field) and
|
|
77
|
+
* `stopAutofill()` when the user submits an identifier or the form goes away.
|
|
78
|
+
* `onResult` gets every outcome — the form treats it like any sign-in result:
|
|
79
|
+
* a `complete` attempt re-boots (the finish already set the cookie), a pending
|
|
80
|
+
* one continues at its step, errors show on the form. A cancelled prompt is a
|
|
81
|
+
* `PASSKEY_CANCELLED` error carrying `cancelledMessage` when given.
|
|
82
|
+
*/
|
|
83
|
+
export interface PasskeySignInController {
|
|
84
|
+
signIn(): Promise<void>;
|
|
85
|
+
armAutofill(): void;
|
|
86
|
+
stopAutofill(): void;
|
|
87
|
+
}
|
|
88
|
+
export declare function createPasskeySignInController(opts: {
|
|
89
|
+
client: FapiClient;
|
|
90
|
+
onResult: (next: FlowState) => void | Promise<void>;
|
|
91
|
+
/** Called before a button-started ceremony (show busy). */
|
|
92
|
+
onStart?: () => void;
|
|
93
|
+
captcha?: () => PasskeySignInCaptcha | null | undefined;
|
|
94
|
+
cancelledMessage?: () => string;
|
|
95
|
+
host?: WebAuthnHost;
|
|
96
|
+
} & PasskeyExtensionOptions): PasskeySignInController;
|
package/dist/passkey-sign-in.js
CHANGED
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.PASSKEY_SIGN_IN_BEGIN_PATH = void 0;
|
|
3
|
+
exports.PASSKEY_SIGN_IN_FINISH_PATH = exports.PASSKEY_SIGN_IN_BEGIN_PATH = void 0;
|
|
4
4
|
exports.beginPasskeySignIn = beginPasskeySignIn;
|
|
5
|
+
exports.signInWithPasskey = signInWithPasskey;
|
|
6
|
+
exports.startConditionalPasskeySignIn = startConditionalPasskeySignIn;
|
|
7
|
+
exports.createPasskeySignInController = createPasskeySignInController;
|
|
5
8
|
const captcha_widget_1 = require("./captcha-widget");
|
|
9
|
+
const passkey_1 = require("./passkey");
|
|
6
10
|
exports.PASSKEY_SIGN_IN_BEGIN_PATH = '/v1/client/sign_ins/passkey/begin';
|
|
7
11
|
const ask = async (source, request) => {
|
|
8
12
|
try {
|
|
@@ -38,4 +42,133 @@ async function beginPasskeySignIn(client, opts = {}) {
|
|
|
38
42
|
return response;
|
|
39
43
|
return post(fresh);
|
|
40
44
|
}
|
|
45
|
+
exports.PASSKEY_SIGN_IN_FINISH_PATH = '/v1/client/sign_ins/passkey/finish';
|
|
46
|
+
/**
|
|
47
|
+
* Usernameless passkey sign-in, start to finish: begin (with the captcha when
|
|
48
|
+
* the instance challenges sign-ins) → the browser ceremony → finish.
|
|
49
|
+
*
|
|
50
|
+
* The finish sets the session cookies itself, so a `complete` result carries no
|
|
51
|
+
* ticket to exchange: the caller re-boots, exactly as after any sign-in. A
|
|
52
|
+
* passkey that proved presence only, on an account that owes MFA, returns the
|
|
53
|
+
* attempt at its second-factor step instead; continue there like any sign-in.
|
|
54
|
+
* A cancelled browser prompt is a `PASSKEY_CANCELLED` error, never a throw.
|
|
55
|
+
* PRF outputs (`prf` / `onExtensionResults`) go to the app only, never to Atlas.
|
|
56
|
+
*/
|
|
57
|
+
async function signInWithPasskey(client, opts = {}) {
|
|
58
|
+
const base = { attempt: null, errors: [], busy: false, pollSecret: null, ticket: null };
|
|
59
|
+
const begin = await beginPasskeySignIn(client, { captcha: opts.captcha ?? null });
|
|
60
|
+
if (!begin.ok || !begin.data)
|
|
61
|
+
return { ...base, errors: begin.errors };
|
|
62
|
+
let body;
|
|
63
|
+
try {
|
|
64
|
+
body = await (0, passkey_1.getPasskeyAssertion)(begin.data, {
|
|
65
|
+
...(opts.host ? { host: opts.host } : {}),
|
|
66
|
+
...(opts.mediation ? { mediation: opts.mediation } : {}),
|
|
67
|
+
...(opts.signal ? { signal: opts.signal } : {}),
|
|
68
|
+
...(opts.prf ? { prf: opts.prf } : {}),
|
|
69
|
+
...(opts.onExtensionResults ? { onExtensionResults: opts.onExtensionResults } : {}),
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
return {
|
|
74
|
+
...base,
|
|
75
|
+
errors: [
|
|
76
|
+
{
|
|
77
|
+
code: 'PASSKEY_CANCELLED',
|
|
78
|
+
message: error instanceof Error && error.message ? error.message : 'Passkey sign-in was cancelled.',
|
|
79
|
+
},
|
|
80
|
+
],
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
const done = await client.post(exports.PASSKEY_SIGN_IN_FINISH_PATH, body);
|
|
84
|
+
if (!done.ok || !done.data)
|
|
85
|
+
return { ...base, errors: done.errors };
|
|
86
|
+
return { ...base, attempt: done.data, ticket: done.data.ticket ?? null };
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Conditional (autofill) passkey sign-in: when the browser supports conditional
|
|
90
|
+
* mediation, run a background passkey request so saved passkeys appear in the
|
|
91
|
+
* autofill of an input with `autocomplete="username webauthn"`. `onResult` gets
|
|
92
|
+
* the outcome only when the user picks a passkey; a cancelled or aborted
|
|
93
|
+
* request is silent. Abort `signal` the moment the user does anything else
|
|
94
|
+
* (submits the form, presses the passkey button). Resolves false when it was
|
|
95
|
+
* not armed (unsupported browser, or `skip`).
|
|
96
|
+
*
|
|
97
|
+
* No captcha: an instance that challenges every sign-in refuses the begin, and
|
|
98
|
+
* the autofill stays off quietly; the button and the email step take the
|
|
99
|
+
* challenge instead.
|
|
100
|
+
*/
|
|
101
|
+
async function startConditionalPasskeySignIn(client, opts) {
|
|
102
|
+
// An injected host (tests, embedded webviews) stands in for the global WebAuthn API.
|
|
103
|
+
if (!opts.host && !(0, passkey_1.passkeysSupported)())
|
|
104
|
+
return false;
|
|
105
|
+
let available = false;
|
|
106
|
+
try {
|
|
107
|
+
available = await (0, passkey_1.conditionalUiAvailable)();
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
available = false;
|
|
111
|
+
}
|
|
112
|
+
if (!available || opts.signal.aborted)
|
|
113
|
+
return false;
|
|
114
|
+
const next = await signInWithPasskey(client, { ...opts, mediation: 'conditional' });
|
|
115
|
+
if (opts.signal.aborted)
|
|
116
|
+
return true;
|
|
117
|
+
// A refused begin or a dismissed autofill is not an error the user caused.
|
|
118
|
+
if (!next.attempt && next.errors.length > 0)
|
|
119
|
+
return true;
|
|
120
|
+
opts.onResult(next);
|
|
121
|
+
return true;
|
|
122
|
+
}
|
|
123
|
+
function createPasskeySignInController(opts) {
|
|
124
|
+
let autofill = null;
|
|
125
|
+
const extensions = () => ({
|
|
126
|
+
...(opts.host ? { host: opts.host } : {}),
|
|
127
|
+
...(opts.prf ? { prf: opts.prf } : {}),
|
|
128
|
+
...(opts.onExtensionResults ? { onExtensionResults: opts.onExtensionResults } : {}),
|
|
129
|
+
});
|
|
130
|
+
const localized = (next) => opts.cancelledMessage
|
|
131
|
+
? { ...next, errors: next.errors.map((e) => (e.code === 'PASSKEY_CANCELLED' ? { ...e, message: opts.cancelledMessage() } : e)) }
|
|
132
|
+
: next;
|
|
133
|
+
const stopAutofill = () => {
|
|
134
|
+
autofill?.abort();
|
|
135
|
+
autofill = null;
|
|
136
|
+
};
|
|
137
|
+
return {
|
|
138
|
+
stopAutofill,
|
|
139
|
+
armAutofill() {
|
|
140
|
+
stopAutofill();
|
|
141
|
+
// An always-on sign-in captcha needs the user to act: the button takes it instead.
|
|
142
|
+
if (opts.captcha?.()?.needed)
|
|
143
|
+
return;
|
|
144
|
+
const controller = new AbortController();
|
|
145
|
+
autofill = controller;
|
|
146
|
+
void startConditionalPasskeySignIn(opts.client, {
|
|
147
|
+
signal: controller.signal,
|
|
148
|
+
...extensions(),
|
|
149
|
+
onResult: (next) => void opts.onResult(localized(next)),
|
|
150
|
+
});
|
|
151
|
+
},
|
|
152
|
+
async signIn() {
|
|
153
|
+
stopAutofill();
|
|
154
|
+
opts.onStart?.();
|
|
155
|
+
const captcha = opts.captcha?.() ?? null;
|
|
156
|
+
let spent = false;
|
|
157
|
+
const next = await signInWithPasskey(opts.client, {
|
|
158
|
+
captcha: captcha?.needed
|
|
159
|
+
? async () => {
|
|
160
|
+
const token = await captcha.getToken();
|
|
161
|
+
if (token)
|
|
162
|
+
spent = true;
|
|
163
|
+
return token;
|
|
164
|
+
}
|
|
165
|
+
: null,
|
|
166
|
+
...extensions(),
|
|
167
|
+
});
|
|
168
|
+
if (spent)
|
|
169
|
+
captcha?.reset();
|
|
170
|
+
await opts.onResult(localized(next));
|
|
171
|
+
},
|
|
172
|
+
};
|
|
173
|
+
}
|
|
41
174
|
//# sourceMappingURL=passkey-sign-in.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"passkey-sign-in.js","sourceRoot":"","sources":["../src/passkey-sign-in.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"passkey-sign-in.js","sourceRoot":"","sources":["../src/passkey-sign-in.ts"],"names":[],"mappings":"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"}
|
package/dist/version.d.ts
CHANGED
package/dist/version.js
CHANGED
|
@@ -7,5 +7,5 @@ exports.ATLAS_JS_VERSION = void 0;
|
|
|
7
7
|
* package.json at runtime) so the bundle stays dependency-free and tests stay
|
|
8
8
|
* deterministic; `version.test.ts` fails when it drifts from package.json.
|
|
9
9
|
*/
|
|
10
|
-
exports.ATLAS_JS_VERSION = '0.
|
|
10
|
+
exports.ATLAS_JS_VERSION = '0.28.0';
|
|
11
11
|
//# sourceMappingURL=version.js.map
|