@atlasauth/js 0.14.0 → 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.
Files changed (63) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/dist/account-hints.d.ts +53 -0
  3. package/dist/account-hints.js +114 -0
  4. package/dist/account-hints.js.map +1 -0
  5. package/dist/attempt.d.ts +3 -1
  6. package/dist/attempt.js.map +1 -1
  7. package/dist/captcha-controller.d.ts +21 -0
  8. package/dist/captcha-controller.js +35 -0
  9. package/dist/captcha-controller.js.map +1 -1
  10. package/dist/dev-browser.d.ts +30 -0
  11. package/dist/dev-browser.js +175 -0
  12. package/dist/dev-browser.js.map +1 -0
  13. package/dist/environment.d.ts +48 -0
  14. package/dist/environment.js +54 -1
  15. package/dist/environment.js.map +1 -1
  16. package/dist/fapi.d.ts +42 -3
  17. package/dist/fapi.js +94 -9
  18. package/dist/fapi.js.map +1 -1
  19. package/dist/impersonation.d.ts +44 -0
  20. package/dist/impersonation.js +47 -0
  21. package/dist/impersonation.js.map +1 -0
  22. package/dist/index.d.ts +11 -0
  23. package/dist/index.js +30 -1
  24. package/dist/index.js.map +1 -1
  25. package/dist/instance-settings.d.ts +7 -1
  26. package/dist/instance-settings.js +15 -1
  27. package/dist/instance-settings.js.map +1 -1
  28. package/dist/mfa-enrollment.d.ts +154 -0
  29. package/dist/mfa-enrollment.js +288 -0
  30. package/dist/mfa-enrollment.js.map +1 -0
  31. package/dist/organization-audit-log.d.ts +63 -0
  32. package/dist/organization-audit-log.js +96 -0
  33. package/dist/organization-audit-log.js.map +1 -0
  34. package/dist/organizations.d.ts +330 -0
  35. package/dist/organizations.js +375 -0
  36. package/dist/organizations.js.map +1 -0
  37. package/dist/passkey-sign-in.d.ts +40 -0
  38. package/dist/passkey-sign-in.js +41 -0
  39. package/dist/passkey-sign-in.js.map +1 -0
  40. package/dist/passkey-sign-up.d.ts +46 -0
  41. package/dist/passkey-sign-up.js +98 -0
  42. package/dist/passkey-sign-up.js.map +1 -0
  43. package/dist/password-reset.d.ts +12 -0
  44. package/dist/password-reset.js +15 -0
  45. package/dist/password-reset.js.map +1 -1
  46. package/dist/phone-numbers.d.ts +43 -0
  47. package/dist/phone-numbers.js +65 -0
  48. package/dist/phone-numbers.js.map +1 -0
  49. package/dist/profile.d.ts +24 -0
  50. package/dist/profile.js +24 -0
  51. package/dist/profile.js.map +1 -0
  52. package/dist/referral-detect.d.ts +90 -0
  53. package/dist/referral-detect.js +432 -0
  54. package/dist/referral-detect.js.map +1 -0
  55. package/dist/referral.d.ts +59 -29
  56. package/dist/referral.js +96 -47
  57. package/dist/referral.js.map +1 -1
  58. package/dist/sign-out-guard.d.ts +8 -0
  59. package/dist/sign-out-guard.js +15 -0
  60. package/dist/sign-out-guard.js.map +1 -1
  61. package/dist/version.d.ts +1 -1
  62. package/dist/version.js +1 -1
  63. package/package.json +2 -2
package/CHANGELOG.md CHANGED
@@ -1,5 +1,36 @@
1
1
  # @atlasauth/js changelog
2
2
 
3
+ ## 0.16.0 — 2026-10-23
4
+
5
+ ### Added
6
+
7
+ - `createOrganizationAuditLog(client, { pageSize, action })`: the framework-agnostic pager behind every SDK's `<OrganizationAuditLog/>`, with `organizationAuditLogPath`, `describeAuditAction` and the `OrganizationAuditLogEntry` type.
8
+ - Sign-up starts, and every start that can create an account (social, enterprise SSO and SAML, DiscourseConnect, native id_token, external JWT, LDAP, Telegram and wallet sign-ins), send the stable device id, so an instance's accounts-per-device limit counts devices rather than networks, across email and social sign-ups alike. `DEVICE_ID_ROUTES` lists them.
9
+ - The recovery codes an MFA enrolment completes the sign-in with: `advance` moves `backup_codes` off the attempt into `FlowState.recoveryCodes` (memory only), and the components show them before exchanging the ticket with `pendingRecoveryCodes`, `acknowledgeRecoveryCodes`, `copyRecoveryCodes`, `downloadRecoveryCodes` / `canDownloadRecoveryCodes` (a `recovery-codes.txt` file), `recoveryCodesText` and `recoveryCodesFrom`.
10
+ - The sign-in's MFA steps, shared by every framework SDK: `createMfaEnrollment` (the enrolment step's state and requests: authenticator app with `qrCode`, or a texted code), `prepareMfaEnrollment`, `enrollmentSubmitKey`, `groupSetupKey`, `prepareSecondFactorCode` (`sms` or `email_code`) and `mfaChoicesFrom`.
11
+ - `requestForStep` posts a texted enrolment as `{ factor_id, code }` (values with `enrollStrategy: 'phone_code'`).
12
+ - `AccountUx.mfa` (`{ totp, sms, totpCodes }`), read from `account.mfa` when the server sends it.
13
+ - `beginPasskeySignIn(client, { captcha })`: the passkey sign-in start (`sign_ins/passkey/begin`) with the sign-in captcha folded in. It sends `captcha_token` when the token source has one, and after a `CAPTCHA_REQUIRED` / `CAPTCHA_FAILED` refusal asks once for a fresh token and retries once.
14
+
15
+ ## 0.15.0
16
+
17
+ ### Added
18
+
19
+ - Referral capture works with any referral program and any consent manager: it reads Referally, Rewardful, Tolt, PromoteKit, FirstPromoter, PartnerStack and Dub (the instance's `browser_sources`), and asks Cookie Munch, OneTrust, Cookiebot, Didomi, Usercentrics, Osano, CookieYes, Complianz, Klaro, any IAB TCF v2 manager or Google Consent Mode for consent (the instance's `consent_provider`).
20
+ - `referralSource` (client option, `configureReferralCapture`, and `source` on `signIn` / `referralParams`): your own reader for any other program.
21
+ - `detectConsent`, `detectConsentProvider`, `detectReferralSource`, `REFERRAL_BROWSER_SOURCES` and `CONSENT_PROVIDERS` are exported.
22
+ - A captured referral says where it came from (`source`) and who decided consent (`consent_by`), also as `ref_source` / `ref_consent_by` on redirects, for the delivery log.
23
+
24
+ ### Changed
25
+
26
+ - A consent manager on the page decides; `referralConsent` applies when there is none (or when the instance's `consent_provider` is `app`).
27
+
28
+ ### Fixed
29
+
30
+ - Development instances: sign-in from `localhost` keeps working where the browser blocks the instance's cookie as third-party (Chrome, Safari). On a `pk_test_` key the SDK keeps the session's refresh token in `localStorage` and sends it as `x-refresh-token`; production keys never do.
31
+ - After a sign-in completes, the panel says "You're signed in" only once this browser holds the session, and says plainly when the browser didn't keep it, instead of "you are signed in where you started". That message is now shown only for a sign-in completed on another device.
32
+ - `withDevBrowser`, `devBrowserEnabled`, `devBrowserToken` and `forgetDevBrowserToken` are exported for custom fetch layers.
33
+
3
34
  ## 0.14.0
4
35
  - **Referral capture v2.** One source per referral, in precedence order and never mixed: the page's referral script (`window.aff.getReferral()` → `{code, clickId, anonId, ts}`), explicit `ref_*` URL parameters (`ref`, `ref_click_id`, `ref_anon_id`, `ref_consent`, `ref_captured_at`), a code in the instance's URL parameters, then the tracking cookie. A URL code no longer travels with the cookie's click id. Click and anonymous ids are sent only with consent (Cookie Munch, `referralConsent`, or `ref_consent=granted` on the URL); without it only the code goes. The cookie may carry `ts` (becomes `captured_at`) and `exp` (an expired cookie is ignored).
5
36
  - **New redirect helpers:** `signIn({ url | frontendApi, redirectUrl?, referral?: false | 'auto', consent?, config?, navigate? })` / `signUp(...)` go to the hosted page (or any URL, e.g. `/oauth2/authorize`) with the referral as `ref_*` query parameters; `referralParams(options)` and `withReferralParams(url, options)` for your own redirects.
@@ -0,0 +1,53 @@
1
+ import type { FapiClient } from './fapi';
2
+ import type { UsernameRule } from './environment';
3
+ /**
4
+ * Sign-up / sign-in form hints: whether a username is free (a live hint beside
5
+ * the field) and which method this browser last signed in with (the "Last used"
6
+ * badge). Both are hints only — the server enforces everything on submit.
7
+ */
8
+ /** `POST /v1/client/usernames/availability`. */
9
+ export interface UsernameAvailability {
10
+ username: string;
11
+ /** Meets the instance's username rule. */
12
+ valid: boolean;
13
+ /** Valid and nobody holds it. */
14
+ available: boolean;
15
+ /** The rule it breaks, when not valid. */
16
+ message?: string;
17
+ }
18
+ /**
19
+ * Ask whether a username is free. Null when the server cannot say (usernames
20
+ * off, rate-limited, unreachable) — a form then simply shows no hint.
21
+ */
22
+ export declare function checkUsernameAvailability(client: FapiClient, username: string): Promise<UsernameAvailability | null>;
23
+ /** Check a username against the rule locally (before asking the server). */
24
+ export declare function usernameMeetsRule(username: string, rule: UsernameRule): boolean;
25
+ /**
26
+ * The method this browser last signed in with, as the server recorded it
27
+ * (`password`, `email_code`, `email_link`, `passkey`, `phone_code`,
28
+ * `oauth_google`, …). Null when none is remembered, the instance turned the
29
+ * hint off, or the server cannot be reached.
30
+ */
31
+ export declare function fetchLastSignInMethod(client: FapiClient): Promise<string | null>;
32
+ /**
33
+ * Whether a sign-in option is the one last used. `option` is a first factor
34
+ * (`password`, `email_code`, `passkey`, …) or a social provider id (`google`).
35
+ * Email code and email link count as one ("email"), as do the OAuth and the
36
+ * native flow of a provider.
37
+ */
38
+ export declare function isLastUsed(lastMethod: string | null | undefined, option: string): boolean;
39
+ /**
40
+ * The label a sign-in form shows for a first-party "Last used" method
41
+ * (`Last used: Password`), or null for social / enterprise methods (badged on
42
+ * their own buttons) and anything unrecognised. `t` is the form's translator.
43
+ */
44
+ export declare function lastUsedMethodLabel(lastMethod: string | null | undefined, t: (key: string) => string): string | null;
45
+ /**
46
+ * Email OTP second factor: mail a code to the user's verified address for this
47
+ * sign-in attempt (on its `needs_second_factor` step). Resolves the masked
48
+ * address it went to; the code is then submitted like any second-factor code.
49
+ * Throws with the server's message when the factor is not offered.
50
+ */
51
+ export declare function prepareEmailSecondFactor(client: FapiClient, attemptId: string): Promise<{
52
+ sentTo: string;
53
+ }>;
@@ -0,0 +1,114 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.checkUsernameAvailability = checkUsernameAvailability;
4
+ exports.usernameMeetsRule = usernameMeetsRule;
5
+ exports.fetchLastSignInMethod = fetchLastSignInMethod;
6
+ exports.isLastUsed = isLastUsed;
7
+ exports.lastUsedMethodLabel = lastUsedMethodLabel;
8
+ exports.prepareEmailSecondFactor = prepareEmailSecondFactor;
9
+ /**
10
+ * Ask whether a username is free. Null when the server cannot say (usernames
11
+ * off, rate-limited, unreachable) — a form then simply shows no hint.
12
+ */
13
+ async function checkUsernameAvailability(client, username) {
14
+ try {
15
+ const response = await client.post('/v1/client/usernames/availability', { username });
16
+ const d = response.data;
17
+ if (!response.ok || !d)
18
+ return null;
19
+ return {
20
+ username: typeof d.username === 'string' ? d.username : username.trim(),
21
+ valid: d.valid === true,
22
+ available: d.available === true,
23
+ ...(typeof d.message === 'string' ? { message: d.message } : {}),
24
+ };
25
+ }
26
+ catch {
27
+ return null;
28
+ }
29
+ }
30
+ const CHARSET_RE = {
31
+ default: /^[A-Za-z0-9._-]+$/,
32
+ alphanumeric: /^[A-Za-z0-9]+$/,
33
+ alphanumeric_underscore: /^[A-Za-z0-9_]+$/,
34
+ };
35
+ /** Check a username against the rule locally (before asking the server). */
36
+ function usernameMeetsRule(username, rule) {
37
+ const v = username.trim();
38
+ return v.length >= rule.minLength && v.length <= rule.maxLength && CHARSET_RE[rule.charset].test(v);
39
+ }
40
+ /**
41
+ * The method this browser last signed in with, as the server recorded it
42
+ * (`password`, `email_code`, `email_link`, `passkey`, `phone_code`,
43
+ * `oauth_google`, …). Null when none is remembered, the instance turned the
44
+ * hint off, or the server cannot be reached.
45
+ */
46
+ async function fetchLastSignInMethod(client) {
47
+ try {
48
+ const response = await client.get('/v1/client/last_sign_in_method');
49
+ const m = response.ok ? response.data?.method : null;
50
+ return typeof m === 'string' && m ? m : null;
51
+ }
52
+ catch {
53
+ return null;
54
+ }
55
+ }
56
+ /**
57
+ * Whether a sign-in option is the one last used. `option` is a first factor
58
+ * (`password`, `email_code`, `passkey`, …) or a social provider id (`google`).
59
+ * Email code and email link count as one ("email"), as do the OAuth and the
60
+ * native flow of a provider.
61
+ */
62
+ function isLastUsed(lastMethod, option) {
63
+ if (!lastMethod)
64
+ return false;
65
+ const norm = (m) => {
66
+ if (m.startsWith('oauth_'))
67
+ return `oauth:${m.slice(6)}`;
68
+ if (m.startsWith('id_token_'))
69
+ return `oauth:${m.slice(9)}`;
70
+ if (m === 'email_code' || m === 'email_link')
71
+ return 'email';
72
+ return m;
73
+ };
74
+ const last = norm(lastMethod);
75
+ return last === norm(option) || last === `oauth:${option}`;
76
+ }
77
+ /**
78
+ * The label a sign-in form shows for a first-party "Last used" method
79
+ * (`Last used: Password`), or null for social / enterprise methods (badged on
80
+ * their own buttons) and anything unrecognised. `t` is the form's translator.
81
+ */
82
+ function lastUsedMethodLabel(lastMethod, t) {
83
+ switch (lastMethod) {
84
+ case 'password':
85
+ return t('signIn.passwordLabel');
86
+ case 'email_code':
87
+ case 'email_link':
88
+ return t('signIn.identifierLabel');
89
+ case 'passkey':
90
+ return 'Passkey';
91
+ case 'phone_code':
92
+ return 'Phone';
93
+ default:
94
+ return null;
95
+ }
96
+ }
97
+ /**
98
+ * Email OTP second factor: mail a code to the user's verified address for this
99
+ * sign-in attempt (on its `needs_second_factor` step). Resolves the masked
100
+ * address it went to; the code is then submitted like any second-factor code.
101
+ * Throws with the server's message when the factor is not offered.
102
+ */
103
+ async function prepareEmailSecondFactor(client, attemptId) {
104
+ const response = await client.post(`/v1/client/sign_ins/${encodeURIComponent(attemptId)}/prepare_second_factor`, { strategy: 'email_code' });
105
+ if (!response.ok) {
106
+ const first = response.errors[0];
107
+ const error = new Error(first?.message ?? 'Could not send the code.');
108
+ if (first?.code)
109
+ error.code = first.code;
110
+ throw error;
111
+ }
112
+ return { sentTo: typeof response.data?.sent_to === 'string' ? response.data.sent_to : '' };
113
+ }
114
+ //# sourceMappingURL=account-hints.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"account-hints.js","sourceRoot":"","sources":["../src/account-hints.ts"],"names":[],"mappings":";;AAwBA,8DAsBC;AASD,8CAGC;AAQD,sDAQC;AAQD,gCAUC;AAOD,kDAiBC;AAQD,4DAeC;AAvHD;;;GAGG;AACI,KAAK,UAAU,yBAAyB,CAC7C,MAAkB,EAClB,QAAgB;IAEhB,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,CAK/B,mCAAmC,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;QACtD,MAAM,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC;QACxB,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;QACpC,OAAO;YACL,QAAQ,EAAE,OAAO,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE;YACvE,KAAK,EAAE,CAAC,CAAC,KAAK,KAAK,IAAI;YACvB,SAAS,EAAE,CAAC,CAAC,SAAS,KAAK,IAAI;YAC/B,GAAG,CAAC,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACjE,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,GAA4C;IAC1D,OAAO,EAAE,mBAAmB;IAC5B,YAAY,EAAE,gBAAgB;IAC9B,uBAAuB,EAAE,iBAAiB;CAC3C,CAAC;AAEF,4EAA4E;AAC5E,SAAgB,iBAAiB,CAAC,QAAgB,EAAE,IAAkB;IACpE,MAAM,CAAC,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;IAC1B,OAAO,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC,SAAS,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACtG,CAAC;AAED;;;;;GAKG;AACI,KAAK,UAAU,qBAAqB,CAAC,MAAkB;IAC5D,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,GAAG,CAAuB,gCAAgC,CAAC,CAAC;QAC1F,MAAM,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;QACrD,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC/C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,SAAgB,UAAU,CAAC,UAAqC,EAAE,MAAc;IAC9E,IAAI,CAAC,UAAU;QAAE,OAAO,KAAK,CAAC;IAC9B,MAAM,IAAI,GAAG,CAAC,CAAS,EAAE,EAAE;QACzB,IAAI,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC;YAAE,OAAO,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QACzD,IAAI,CAAC,CAAC,UAAU,CAAC,WAAW,CAAC;YAAE,OAAO,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5D,IAAI,CAAC,KAAK,YAAY,IAAI,CAAC,KAAK,YAAY;YAAE,OAAO,OAAO,CAAC;QAC7D,OAAO,CAAC,CAAC;IACX,CAAC,CAAC;IACF,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC;IAC9B,OAAO,IAAI,KAAK,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,KAAK,SAAS,MAAM,EAAE,CAAC;AAC7D,CAAC;AAED;;;;GAIG;AACH,SAAgB,mBAAmB,CACjC,UAAqC,EACrC,CAA0B;IAE1B,QAAQ,UAAU,EAAE,CAAC;QACnB,KAAK,UAAU;YACb,OAAO,CAAC,CAAC,sBAAsB,CAAC,CAAC;QACnC,KAAK,YAAY,CAAC;QAClB,KAAK,YAAY;YACf,OAAO,CAAC,CAAC,wBAAwB,CAAC,CAAC;QACrC,KAAK,SAAS;YACZ,OAAO,SAAS,CAAC;QACnB,KAAK,YAAY;YACf,OAAO,OAAO,CAAC;QACjB;YACE,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACI,KAAK,UAAU,wBAAwB,CAC5C,MAAkB,EAClB,SAAiB;IAEjB,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,CAChC,uBAAuB,kBAAkB,CAAC,SAAS,CAAC,wBAAwB,EAC5E,EAAE,QAAQ,EAAE,YAAY,EAAE,CAC3B,CAAC;IACF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACjC,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,KAAK,EAAE,OAAO,IAAI,0BAA0B,CAA8B,CAAC;QACnG,IAAI,KAAK,EAAE,IAAI;YAAE,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;QACzC,MAAM,KAAK,CAAC;IACd,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,OAAO,QAAQ,CAAC,IAAI,EAAE,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;AAC7F,CAAC"}
package/dist/attempt.d.ts CHANGED
@@ -54,11 +54,13 @@ export interface AttemptView {
54
54
  */
55
55
  id: string | null;
56
56
  /** The resource type the server stamps on every attempt view. */
57
- object?: 'sign_in_attempt';
57
+ object?: 'sign_in_attempt' | 'sign_up_attempt';
58
58
  status: string;
59
59
  /** The identifier the attempt was started with; `null` before one is collected. */
60
60
  identifier?: string | null;
61
61
  supported_first_factors?: string[];
62
+ /** `passkey` on a passkey-only sign-up (see `awaitingPasskey`). */
63
+ strategy?: string;
62
64
  created_session_id?: string | null;
63
65
  /** Attempt expiry (epoch ms); `null` on the pre-attempt challenge marker. */
64
66
  expires_at?: number | null;
@@ -1 +1 @@
1
- {"version":3,"file":"attempt.js","sourceRoot":"","sources":["../src/attempt.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"attempt.js","sourceRoot":"","sources":["../src/attempt.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import { type FieldError } from './attempt';
2
2
  import { type FapiClient, type FlowState } from './fapi';
3
+ import type { WebAuthnHost } from './passkey';
3
4
  import type { AtlasCaptchaLabels } from './atlas-captcha';
4
5
  import { type FlowCaptcha } from './captcha-widget';
5
6
  /**
@@ -103,3 +104,23 @@ export declare function createSignUp(client: FapiClient, values: Record<string,
103
104
  captcha?: CaptchaController | null;
104
105
  t: (key: string) => string;
105
106
  }): Promise<FlowState>;
107
+ /**
108
+ * {@link createSignUp} for a passkey-only sign-up (`account.passkeySignUp`):
109
+ * POSTs `/v1/client/sign_ups/passkey` with the email (when the form collected
110
+ * one) and the configured sign-up fields — never a password. No account exists
111
+ * until {@link finishPasskeySignUp} registers the passkey.
112
+ */
113
+ export declare function createPasskeySignUp(client: FapiClient, values: Record<string, string>, opts: {
114
+ consent: boolean;
115
+ captcha?: CaptchaController | null;
116
+ t: (key: string) => string;
117
+ }): Promise<FlowState>;
118
+ /**
119
+ * The passkey-only sign-up's last step, for a prebuilt form: run the browser
120
+ * ceremony, and the server creates the account when it verifies. A cancelled
121
+ * prompt reads `signUp.passkeyCancelled` from the form's catalog.
122
+ */
123
+ export declare function finishPasskeySignUp(client: FapiClient, state: FlowState, opts: {
124
+ t: (key: string) => string;
125
+ host?: WebAuthnHost;
126
+ }): Promise<FlowState>;
@@ -5,9 +5,12 @@ exports.localizeCaptchaErrors = localizeCaptchaErrors;
5
5
  exports.signInCaptchaOptions = signInCaptchaOptions;
6
6
  exports.advanceWithCaptcha = advanceWithCaptcha;
7
7
  exports.createSignUp = createSignUp;
8
+ exports.createPasskeySignUp = createPasskeySignUp;
9
+ exports.finishPasskeySignUp = finishPasskeySignUp;
8
10
  const attempt_1 = require("./attempt");
9
11
  const fapi_1 = require("./fapi");
10
12
  const instance_settings_1 = require("./instance-settings");
13
+ const passkey_sign_up_1 = require("./passkey-sign-up");
11
14
  const captcha_widget_1 = require("./captcha-widget");
12
15
  function createCaptchaController(initial, settings = {}) {
13
16
  let options = initial ?? { flow: undefined, active: false };
@@ -204,4 +207,36 @@ async function createSignUp(client, values, opts) {
204
207
  opts.captcha.reset();
205
208
  return next;
206
209
  }
210
+ /**
211
+ * {@link createSignUp} for a passkey-only sign-up (`account.passkeySignUp`):
212
+ * POSTs `/v1/client/sign_ups/passkey` with the email (when the form collected
213
+ * one) and the configured sign-up fields — never a password. No account exists
214
+ * until {@link finishPasskeySignUp} registers the passkey.
215
+ */
216
+ async function createPasskeySignUp(client, values, opts) {
217
+ const token = opts.captcha ? await opts.captcha.getToken() : null;
218
+ const { email, fields, consent } = (0, instance_settings_1.toSignUpInput)(values, opts.consent, token);
219
+ let next = await (0, passkey_sign_up_1.startPasskeySignUp)(client, {
220
+ ...(email ? { email } : {}),
221
+ fields,
222
+ consent,
223
+ ...(token ? { captchaToken: token } : {}),
224
+ });
225
+ next = { ...next, errors: localizeCaptchaErrors(next.errors, opts.t).errors };
226
+ if (next.errors.length > 0 && opts.captcha?.needed)
227
+ opts.captcha.reset();
228
+ return next;
229
+ }
230
+ /**
231
+ * The passkey-only sign-up's last step, for a prebuilt form: run the browser
232
+ * ceremony, and the server creates the account when it verifies. A cancelled
233
+ * prompt reads `signUp.passkeyCancelled` from the form's catalog.
234
+ */
235
+ async function finishPasskeySignUp(client, state, opts) {
236
+ const next = await (0, passkey_sign_up_1.registerSignUpPasskey)(client, state, opts.host ? { host: opts.host } : {});
237
+ return {
238
+ ...next,
239
+ errors: next.errors.map((e) => (e.code === 'PASSKEY_CANCELLED' ? { ...e, message: opts.t('signUp.passkeyCancelled') } : e)),
240
+ };
241
+ }
207
242
  //# sourceMappingURL=captcha-controller.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"captcha-controller.js","sourceRoot":"","sources":["../src/captcha-controller.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"captcha-controller.js","sourceRoot":"","sources":["../src/captcha-controller.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * The "dev browser": sign-in on a development instance from an app on
3
+ * `localhost`.
4
+ *
5
+ * The session lives in cookies on the instance's Frontend API host. From
6
+ * `localhost` that host is cross-site, so a browser that blocks third-party
7
+ * cookies (Chrome, Safari) drops them: the sign-in completes, then the next
8
+ * boot finds no session. On a development instance (a `pk_test_` key) the SDK
9
+ * therefore also keeps the session's refresh token in `localStorage` and
10
+ * presents it as `x-refresh-token`, which development instances accept in
11
+ * place of the cookie. Production keys never do this: a token readable by
12
+ * page scripts is fine for local development, not for real users.
13
+ *
14
+ * {@link withDevBrowser} wraps a `fetch`, so every Frontend API caller (the
15
+ * FAPI client and each framework provider) behaves the same:
16
+ * - `POST /v1/client/tickets/exchange` asks for the refresh token
17
+ * (`return_refresh_token: true`) and keeps it;
18
+ * - `GET /v1/client` and `POST /v1/client/sessions/:id/tokens` present it;
19
+ * the rotated token a refresh returns replaces it;
20
+ * - a boot that finds no session, a refused refresh, or a sign-out forgets it.
21
+ * The cookies are still set and sent where the browser allows them; the
22
+ * header is only read when there is no cookie.
23
+ */
24
+ /** Whether the dev browser applies: a development instance's key, in a browser with storage. */
25
+ export declare function devBrowserEnabled(publishableKey: string): boolean;
26
+ /** The stored refresh token for a development instance, or null. */
27
+ export declare function devBrowserToken(publishableKey: string): string | null;
28
+ /** Forget the stored refresh token (sign-out; tests). */
29
+ export declare function forgetDevBrowserToken(publishableKey: string): void;
30
+ export declare function withDevBrowser(publishableKey: string, fetchImpl: typeof fetch): typeof fetch;
@@ -0,0 +1,175 @@
1
+ "use strict";
2
+ /**
3
+ * The "dev browser": sign-in on a development instance from an app on
4
+ * `localhost`.
5
+ *
6
+ * The session lives in cookies on the instance's Frontend API host. From
7
+ * `localhost` that host is cross-site, so a browser that blocks third-party
8
+ * cookies (Chrome, Safari) drops them: the sign-in completes, then the next
9
+ * boot finds no session. On a development instance (a `pk_test_` key) the SDK
10
+ * therefore also keeps the session's refresh token in `localStorage` and
11
+ * presents it as `x-refresh-token`, which development instances accept in
12
+ * place of the cookie. Production keys never do this: a token readable by
13
+ * page scripts is fine for local development, not for real users.
14
+ *
15
+ * {@link withDevBrowser} wraps a `fetch`, so every Frontend API caller (the
16
+ * FAPI client and each framework provider) behaves the same:
17
+ * - `POST /v1/client/tickets/exchange` asks for the refresh token
18
+ * (`return_refresh_token: true`) and keeps it;
19
+ * - `GET /v1/client` and `POST /v1/client/sessions/:id/tokens` present it;
20
+ * the rotated token a refresh returns replaces it;
21
+ * - a boot that finds no session, a refused refresh, or a sign-out forgets it.
22
+ * The cookies are still set and sent where the browser allows them; the
23
+ * header is only read when there is no cookie.
24
+ */
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.devBrowserEnabled = devBrowserEnabled;
27
+ exports.devBrowserToken = devBrowserToken;
28
+ exports.forgetDevBrowserToken = forgetDevBrowserToken;
29
+ exports.withDevBrowser = withDevBrowser;
30
+ const STORAGE_PREFIX = '__atlas_dev_session:';
31
+ const EXCHANGE = '/v1/client/tickets/exchange';
32
+ const BOOT = '/v1/client';
33
+ const REFRESH = /^\/v1\/client\/sessions\/[^/]+\/tokens$/;
34
+ const REVOKE = /^\/v1\/client\/sessions\/[^/]+\/revoke$/;
35
+ function storage() {
36
+ try {
37
+ const s = globalThis.localStorage;
38
+ return s && typeof s.getItem === 'function' ? s : null;
39
+ }
40
+ catch {
41
+ return null;
42
+ }
43
+ }
44
+ /** Whether the dev browser applies: a development instance's key, in a browser with storage. */
45
+ function devBrowserEnabled(publishableKey) {
46
+ return publishableKey.startsWith('pk_test_') && storage() !== null;
47
+ }
48
+ /** The stored refresh token for a development instance, or null. */
49
+ function devBrowserToken(publishableKey) {
50
+ try {
51
+ return storage()?.getItem(STORAGE_PREFIX + publishableKey) ?? null;
52
+ }
53
+ catch {
54
+ return null;
55
+ }
56
+ }
57
+ const SESSION_SUFFIX = ':sid';
58
+ function remember(publishableKey, token, sessionId) {
59
+ if (typeof token !== 'string' || !token)
60
+ return;
61
+ try {
62
+ storage()?.setItem(STORAGE_PREFIX + publishableKey, token);
63
+ if (typeof sessionId === 'string' && sessionId)
64
+ storage()?.setItem(STORAGE_PREFIX + publishableKey + SESSION_SUFFIX, sessionId);
65
+ }
66
+ catch {
67
+ // Storage full or blocked: the cookie path still works where the browser allows it.
68
+ }
69
+ }
70
+ function storedSessionId(publishableKey) {
71
+ try {
72
+ return storage()?.getItem(STORAGE_PREFIX + publishableKey + SESSION_SUFFIX) ?? null;
73
+ }
74
+ catch {
75
+ return null;
76
+ }
77
+ }
78
+ /** Forget the stored refresh token (sign-out; tests). */
79
+ function forgetDevBrowserToken(publishableKey) {
80
+ try {
81
+ storage()?.removeItem(STORAGE_PREFIX + publishableKey);
82
+ storage()?.removeItem(STORAGE_PREFIX + publishableKey + SESSION_SUFFIX);
83
+ }
84
+ catch {
85
+ // nothing to forget
86
+ }
87
+ }
88
+ function pathOf(input) {
89
+ try {
90
+ const url = typeof input === 'string' ? input : input instanceof URL ? input.href : input.url;
91
+ return new URL(url, 'https://invalid.example').pathname;
92
+ }
93
+ catch {
94
+ return null;
95
+ }
96
+ }
97
+ /** The session id in `/v1/client/sessions/:id/…`. */
98
+ function sessionIdIn(path) {
99
+ const m = /^\/v1\/client\/sessions\/([^/]+)\//.exec(path);
100
+ return m ? decodeURIComponent(m[1]) : null;
101
+ }
102
+ async function bodyOf(response) {
103
+ try {
104
+ const b = (await response.clone().json());
105
+ return b && typeof b === 'object' && !Array.isArray(b) ? b : null;
106
+ }
107
+ catch {
108
+ return null;
109
+ }
110
+ }
111
+ /**
112
+ * `fetchImpl` with the dev browser for `publishableKey`. Returns `fetchImpl`
113
+ * unchanged for a production key or where there is no storage.
114
+ */
115
+ const WRAPPED = Symbol.for('atlas.devBrowser');
116
+ function withDevBrowser(publishableKey, fetchImpl) {
117
+ // A provider hands its (already wrapped) fetch to the FAPI client too: wrap once.
118
+ if (!publishableKey.startsWith('pk_test_') || fetchImpl[WRAPPED])
119
+ return fetchImpl;
120
+ const wrapped = async (input, init) => {
121
+ if (!devBrowserEnabled(publishableKey))
122
+ return fetchImpl(input, init);
123
+ const path = pathOf(input);
124
+ const method = (init?.method ?? 'GET').toUpperCase();
125
+ let nextInit = init;
126
+ let presented = false;
127
+ if (path === EXCHANGE && method === 'POST' && typeof init?.body === 'string') {
128
+ try {
129
+ const body = JSON.parse(init.body);
130
+ if (body && typeof body === 'object' && !Array.isArray(body)) {
131
+ nextInit = { ...init, body: JSON.stringify({ ...body, return_refresh_token: true }) };
132
+ }
133
+ }
134
+ catch {
135
+ // not JSON: send it as it is
136
+ }
137
+ }
138
+ const token = devBrowserToken(publishableKey);
139
+ if (token && ((path === BOOT && method === 'GET') || (path && REFRESH.test(path) && method === 'POST'))) {
140
+ const headers = new Headers(nextInit?.headers);
141
+ if (!headers.has('x-refresh-token'))
142
+ headers.set('x-refresh-token', token);
143
+ nextInit = { ...nextInit, headers };
144
+ presented = true;
145
+ }
146
+ const response = await fetchImpl(input, nextInit);
147
+ if (!path)
148
+ return response;
149
+ if (path === EXCHANGE && response.ok) {
150
+ const body = await bodyOf(response);
151
+ remember(publishableKey, body?.refresh_token, body?.id);
152
+ }
153
+ else if (path && REFRESH.test(path)) {
154
+ if (response.ok)
155
+ remember(publishableKey, (await bodyOf(response))?.refresh_token, sessionIdIn(path));
156
+ else if (presented && response.status === 401)
157
+ forgetDevBrowserToken(publishableKey);
158
+ }
159
+ else if (path === BOOT && presented && response.ok) {
160
+ const body = await bodyOf(response);
161
+ if (body && body.session === null)
162
+ forgetDevBrowserToken(publishableKey);
163
+ }
164
+ else if (path && REVOKE.test(path) && (response.ok || response.status === 404)) {
165
+ // Only this browser's own session: revoking another device keeps us signed in.
166
+ const sid = storedSessionId(publishableKey);
167
+ if (!sid || sid === sessionIdIn(path))
168
+ forgetDevBrowserToken(publishableKey);
169
+ }
170
+ return response;
171
+ };
172
+ wrapped[WRAPPED] = true;
173
+ return wrapped;
174
+ }
175
+ //# sourceMappingURL=dev-browser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev-browser.js","sourceRoot":"","sources":["../src/dev-browser.ts"],"names":[],"mappings":"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"}
@@ -41,6 +41,53 @@ export declare function emailDeliveryFrom(body: unknown): EmailDelivery;
41
41
  * `delivery` (not loaded yet) the list is returned unchanged.
42
42
  */
43
43
  export declare function offeredFirstFactors(strategies: readonly string[], delivery: EmailDelivery | null | undefined): string[];
44
+ /** The username rule an instance enforces (from `account.username`). */
45
+ export interface UsernameRule {
46
+ minLength: number;
47
+ maxLength: number;
48
+ /** `default` = letters, digits and `. _ -`. */
49
+ charset: 'default' | 'alphanumeric' | 'alphanumeric_underscore';
50
+ requiredAtSignUp: boolean;
51
+ }
52
+ /** How an emailed proof arrives: a code to type, a link to click, or either. */
53
+ export type EmailProofDelivery = 'code' | 'link' | 'both';
54
+ /** `account`: what a sign-in / sign-up form needs to draw itself. */
55
+ export interface AccountUx {
56
+ /** Null while usernames are off. */
57
+ username: UsernameRule | null;
58
+ /** Badge the method this browser last signed in with as "Last used". */
59
+ lastSignInMethod: boolean;
60
+ emailVerification: EmailProofDelivery;
61
+ passwordReset: EmailProofDelivery;
62
+ /** The second-factor step may offer "email me a code" ({@link prepareEmailSecondFactor}). */
63
+ emailSecondFactor: boolean;
64
+ /**
65
+ * Passkey-only sign-up ({@link startPasskeySignUp}), when the instance offers
66
+ * it: whether the form collects an email address. Null when not offered.
67
+ */
68
+ passkeySignUp: {
69
+ email: 'off' | 'optional' | 'required';
70
+ } | null;
71
+ /**
72
+ * The second factors a sign-in may set up or use, when the server says
73
+ * (`account.mfa`): an authenticator app, texted codes (on AND the app can
74
+ * text), and how many authenticator codes enrolment asks for. Absent on a
75
+ * server that does not say: the MFA steps then offer the authenticator app
76
+ * only (see `mfaChoicesFrom`).
77
+ */
78
+ mfa?: {
79
+ totp: boolean;
80
+ sms: boolean;
81
+ totpCodes: 1 | 2;
82
+ };
83
+ }
84
+ /**
85
+ * What an older server (no `account`) is taken to mean: no usernames at
86
+ * sign-up, codes only, and no "Last used" hint (it has no endpoint for one).
87
+ */
88
+ export declare const ACCOUNT_UX_DEFAULT: Readonly<AccountUx>;
89
+ /** Read `account` from a `/v1/client/environment` or `/v1/appearance` body. */
90
+ export declare function accountUxFrom(body: unknown): AccountUx;
44
91
  /** One entry of the environment's `social_providers`. */
45
92
  export interface EnvironmentSocialProvider {
46
93
  provider: string;
@@ -72,6 +119,7 @@ export interface ClientEnvironment {
72
119
  strategies: Record<string, unknown>;
73
120
  emailDelivery: EmailDelivery;
74
121
  socialProviders: EnvironmentSocialProvider[];
122
+ account: AccountUx;
75
123
  }
76
124
  /** Read a `/v1/client/environment` body. Defensive: malformed parts read as empty. */
77
125
  export declare function clientEnvironmentFrom(body: unknown): ClientEnvironment;