@sentropic/auth-ui 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +163 -0
  3. package/dist/contracts.d.ts +7 -0
  4. package/dist/contracts.d.ts.map +1 -0
  5. package/dist/contracts.js +7 -0
  6. package/dist/contracts.js.map +1 -0
  7. package/dist/errors.d.ts +7 -0
  8. package/dist/errors.d.ts.map +1 -0
  9. package/dist/errors.js +12 -0
  10. package/dist/errors.js.map +1 -0
  11. package/dist/index.d.ts +3 -0
  12. package/dist/index.d.ts.map +1 -0
  13. package/dist/index.js +3 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/labels.d.ts +5 -0
  16. package/dist/labels.d.ts.map +1 -0
  17. package/dist/labels.js +180 -0
  18. package/dist/labels.js.map +1 -0
  19. package/dist/transport-fetch.d.ts +25 -0
  20. package/dist/transport-fetch.d.ts.map +1 -0
  21. package/dist/transport-fetch.js +98 -0
  22. package/dist/transport-fetch.js.map +1 -0
  23. package/dist/transport-types.d.ts +77 -0
  24. package/dist/transport-types.d.ts.map +1 -0
  25. package/dist/transport-types.js +2 -0
  26. package/dist/transport-types.js.map +1 -0
  27. package/dist/transport.d.ts +3 -0
  28. package/dist/transport.d.ts.map +1 -0
  29. package/dist/transport.js +29 -0
  30. package/dist/transport.js.map +1 -0
  31. package/dist/types.d.ts +137 -0
  32. package/dist/types.d.ts.map +1 -0
  33. package/dist/types.js +2 -0
  34. package/dist/types.js.map +1 -0
  35. package/dist/webauthn.d.ts +26 -0
  36. package/dist/webauthn.d.ts.map +1 -0
  37. package/dist/webauthn.js +76 -0
  38. package/dist/webauthn.js.map +1 -0
  39. package/package.json +86 -0
  40. package/src/components/AuthDevicePair.svelte +173 -0
  41. package/src/components/AuthDevicePair.svelte.d.ts +17 -0
  42. package/src/components/AuthDevices.svelte +313 -0
  43. package/src/components/AuthDevices.svelte.d.ts +18 -0
  44. package/src/components/AuthLogin.svelte +222 -0
  45. package/src/components/AuthLogin.svelte.d.ts +18 -0
  46. package/src/components/AuthMagicLinkVerify.svelte +165 -0
  47. package/src/components/AuthMagicLinkVerify.svelte.d.ts +20 -0
  48. package/src/components/AuthRegister.svelte +394 -0
  49. package/src/components/AuthRegister.svelte.d.ts +25 -0
  50. package/src/contracts.ts +6 -0
  51. package/src/errors.ts +18 -0
  52. package/src/index.ts +2 -0
  53. package/src/labels.ts +186 -0
  54. package/src/transport-fetch.ts +170 -0
  55. package/src/transport-types.ts +105 -0
  56. package/src/transport.ts +33 -0
  57. package/src/types.ts +153 -0
  58. package/src/webauthn.ts +133 -0
@@ -0,0 +1,77 @@
1
+ import type { AuthenticationResponseJSON, PublicKeyCredentialCreationOptionsJSON, PublicKeyCredentialRequestOptionsJSON, RegistrationResponseJSON } from '@simplewebauthn/browser';
2
+ import type { AuthUiCredential, AuthUiResult, AuthUiSession } from './types.js';
3
+ export interface RequestEmailCodeInput {
4
+ email: string;
5
+ }
6
+ export interface RequestEmailCodeResult {
7
+ delivery: 'email' | 'magic_link' | string;
8
+ expiresAt?: string;
9
+ }
10
+ export interface VerifyEmailCodeInput {
11
+ email: string;
12
+ code: string;
13
+ }
14
+ export interface VerifyEmailCodeResult {
15
+ verificationToken: string;
16
+ }
17
+ export interface VerifyMagicLinkInput {
18
+ token: string;
19
+ }
20
+ export interface CreatePasskeyRegistrationOptionsInput {
21
+ email: string;
22
+ verificationToken: string;
23
+ deviceName?: string;
24
+ }
25
+ export interface CreatePasskeyRegistrationOptionsResult {
26
+ userId: string;
27
+ options: PublicKeyCredentialCreationOptionsJSON;
28
+ }
29
+ export interface VerifyPasskeyRegistrationInput {
30
+ email: string;
31
+ verificationToken: string;
32
+ userId: string;
33
+ credential: RegistrationResponseJSON;
34
+ deviceName?: string;
35
+ }
36
+ export interface CreatePasskeyAuthenticationOptionsInput {
37
+ email?: string;
38
+ }
39
+ export interface CreatePasskeyAuthenticationOptionsResult {
40
+ options: PublicKeyCredentialRequestOptionsJSON;
41
+ }
42
+ export interface VerifyPasskeyAuthenticationInput {
43
+ credential: AuthenticationResponseJSON;
44
+ }
45
+ export interface RenameCredentialInput {
46
+ credentialId: string;
47
+ deviceName: string;
48
+ }
49
+ export interface RevokeCredentialInput {
50
+ credentialId: string;
51
+ }
52
+ export interface ListCredentialsResult {
53
+ credentials: AuthUiCredential[];
54
+ }
55
+ export interface ApproveDevicePairingInput {
56
+ userCode: string;
57
+ deviceName?: string;
58
+ }
59
+ export interface ApproveDevicePairingResult {
60
+ deviceName?: string;
61
+ }
62
+ export interface AuthUiTransport {
63
+ requestEmailCode(input: RequestEmailCodeInput): Promise<AuthUiResult<RequestEmailCodeResult>>;
64
+ verifyEmailCode(input: VerifyEmailCodeInput): Promise<AuthUiResult<VerifyEmailCodeResult>>;
65
+ verifyMagicLink(input: VerifyMagicLinkInput): Promise<AuthUiResult<AuthUiSession>>;
66
+ createPasskeyRegistrationOptions(input: CreatePasskeyRegistrationOptionsInput): Promise<AuthUiResult<CreatePasskeyRegistrationOptionsResult>>;
67
+ verifyPasskeyRegistration(input: VerifyPasskeyRegistrationInput): Promise<AuthUiResult<AuthUiSession>>;
68
+ createPasskeyAuthenticationOptions(input: CreatePasskeyAuthenticationOptionsInput): Promise<AuthUiResult<CreatePasskeyAuthenticationOptionsResult>>;
69
+ verifyPasskeyAuthentication(input: VerifyPasskeyAuthenticationInput): Promise<AuthUiResult<AuthUiSession>>;
70
+ refreshSession(): Promise<AuthUiResult<AuthUiSession>>;
71
+ logout(): Promise<AuthUiResult<void>>;
72
+ listCredentials(): Promise<AuthUiResult<ListCredentialsResult>>;
73
+ renameCredential(input: RenameCredentialInput): Promise<AuthUiResult<AuthUiCredential>>;
74
+ revokeCredential(input: RevokeCredentialInput): Promise<AuthUiResult<void>>;
75
+ approveDevicePairing(input: ApproveDevicePairingInput): Promise<AuthUiResult<ApproveDevicePairingResult>>;
76
+ }
77
+ //# sourceMappingURL=transport-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport-types.d.ts","sourceRoot":"","sources":["../src/transport-types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=transport-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport-types.js","sourceRoot":"","sources":["../src/transport-types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ import type { AuthUiTransport } from './transport-types.js';
2
+ export declare const assertAuthUiTransport: (candidate: unknown) => AuthUiTransport;
3
+ //# sourceMappingURL=transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAE5D,eAAO,MAAM,qBAAqB,cAAe,OAAO,KAAG,eA6B1D,CAAC"}
@@ -0,0 +1,29 @@
1
+ import { createAuthUiError } from './errors.js';
2
+ export const assertAuthUiTransport = (candidate) => {
3
+ const requiredMethods = [
4
+ 'requestEmailCode',
5
+ 'verifyEmailCode',
6
+ 'verifyMagicLink',
7
+ 'createPasskeyRegistrationOptions',
8
+ 'verifyPasskeyRegistration',
9
+ 'createPasskeyAuthenticationOptions',
10
+ 'verifyPasskeyAuthentication',
11
+ 'refreshSession',
12
+ 'logout',
13
+ 'listCredentials',
14
+ 'renameCredential',
15
+ 'revokeCredential',
16
+ 'approveDevicePairing',
17
+ ];
18
+ if (!candidate || typeof candidate !== 'object') {
19
+ throw createAuthUiError('invalid_input', 'Auth UI transport must be an object');
20
+ }
21
+ const record = candidate;
22
+ for (const method of requiredMethods) {
23
+ if (typeof record[method] !== 'function') {
24
+ throw createAuthUiError('invalid_input', `Auth UI transport is missing method ${method}`);
25
+ }
26
+ }
27
+ return candidate;
28
+ };
29
+ //# sourceMappingURL=transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.js","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAGhD,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,SAAkB,EAAmB,EAAE;IAC3E,MAAM,eAAe,GAAiC;QACpD,kBAAkB;QAClB,iBAAiB;QACjB,iBAAiB;QACjB,kCAAkC;QAClC,2BAA2B;QAC3B,oCAAoC;QACpC,6BAA6B;QAC7B,gBAAgB;QAChB,QAAQ;QACR,iBAAiB;QACjB,kBAAkB;QAClB,kBAAkB;QAClB,sBAAsB;KACvB,CAAC;IAEF,IAAI,CAAC,SAAS,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;QAChD,MAAM,iBAAiB,CAAC,eAAe,EAAE,qCAAqC,CAAC,CAAC;IAClF,CAAC;IAED,MAAM,MAAM,GAAG,SAAoC,CAAC;IACpD,KAAK,MAAM,MAAM,IAAI,eAAe,EAAE,CAAC;QACrC,IAAI,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,UAAU,EAAE,CAAC;YACzC,MAAM,iBAAiB,CAAC,eAAe,EAAE,uCAAuC,MAAM,EAAE,CAAC,CAAC;QAC5F,CAAC;IACH,CAAC;IAED,OAAO,SAA4B,CAAC;AACtC,CAAC,CAAC"}
@@ -0,0 +1,137 @@
1
+ export type AuthUiErrorCode = 'invalid_input' | 'transport_error' | 'email_code_invalid' | 'magic_link_invalid' | 'passkey_cancelled' | 'passkey_already_registered' | 'passkey_no_matching_authenticator' | 'passkey_not_supported' | 'passkey_registration_failed' | 'passkey_authentication_failed' | 'credential_not_found' | 'unknown';
2
+ export interface AuthUiError extends Error {
3
+ readonly name: 'AuthUiError';
4
+ readonly code: AuthUiErrorCode;
5
+ readonly retryable: boolean;
6
+ readonly cause?: unknown;
7
+ }
8
+ export type AuthUiResult<T> = {
9
+ ok: true;
10
+ value: T;
11
+ } | {
12
+ ok: false;
13
+ error: AuthUiError;
14
+ };
15
+ export interface AuthUiUser {
16
+ id: string;
17
+ email: string;
18
+ displayName?: string | null;
19
+ role?: string | null;
20
+ }
21
+ export interface AuthUiSession {
22
+ user: AuthUiUser;
23
+ sessionToken?: string;
24
+ refreshToken?: string;
25
+ expiresAt?: string;
26
+ }
27
+ export interface AuthUiCredential {
28
+ id: string;
29
+ credentialId: string;
30
+ deviceName: string;
31
+ uv: boolean;
32
+ createdAt: string;
33
+ lastUsedAt: string | null;
34
+ }
35
+ export interface AuthUiNavigation {
36
+ navigate(to: string): void | Promise<void>;
37
+ buildLoginHref?(returnUrl?: string): string;
38
+ buildRegisterHref?(returnUrl?: string): string;
39
+ buildDevicesHref?(): string;
40
+ }
41
+ export interface AuthUiSessionCallbacks {
42
+ onSession?(session: AuthUiSession): void | Promise<void>;
43
+ onLogout?(): void | Promise<void>;
44
+ onError?(error: AuthUiError): void | Promise<void>;
45
+ }
46
+ export interface AuthUiBranding {
47
+ productName?: string;
48
+ logoUrl?: string;
49
+ logoAlt?: string;
50
+ primaryColor?: string;
51
+ accentColor?: string;
52
+ }
53
+ export interface AuthUiLabels {
54
+ loading: string;
55
+ save: string;
56
+ cancel: string;
57
+ emailPlaceholder: string;
58
+ webauthnRegisterNotice: string;
59
+ verifyInProgress: string;
60
+ redirectingDashboard: string;
61
+ registerDeviceNow: string;
62
+ loginTitle: string;
63
+ loginSupportedHint: string;
64
+ loginUnavailable: string;
65
+ loginUnsupportedBrowser: string;
66
+ loginButton: string;
67
+ loginButtonLoading: string;
68
+ loginLostDevice: string;
69
+ loginLostDeviceTitle: string;
70
+ loginNoAccount: string;
71
+ loginRegisterNewDevice: string;
72
+ loginBackToLogin: string;
73
+ registerTitle: string;
74
+ registerSubtitle: string;
75
+ registerUnsupportedBrowserTitle: string;
76
+ registerUnsupportedBrowser: string;
77
+ registerEmailLabel: string;
78
+ registerGetCode: string;
79
+ registerSendingCode: string;
80
+ registerAlreadyHaveAccount: string;
81
+ registerCodeLabel: string;
82
+ registerCodeHelp: string;
83
+ registerVerifyCode: string;
84
+ registerVerifyingCode: string;
85
+ registerChangeEmail: string;
86
+ registerCodeVerifiedTitle: string;
87
+ registerPasskeyButton: string;
88
+ registerRegistering: string;
89
+ registerSuccessTitle: string;
90
+ registerSuccessCodeSent: string;
91
+ registerSuccessRedirecting: string;
92
+ registerErrorInvalidEmail: string;
93
+ registerErrorSendCode: string;
94
+ magicLinkTitle: string;
95
+ magicLinkVerifying: string;
96
+ magicLinkSuccess: string;
97
+ magicLinkSuccessTitle: string;
98
+ magicLinkErrorTitle: string;
99
+ magicLinkBackToLogin: string;
100
+ magicLinkErrorMissingToken: string;
101
+ magicLinkErrorVerifyFailed: string;
102
+ devicesTitle: string;
103
+ devicesSubtitle: string;
104
+ devicesEmpty: string;
105
+ devicesRegister: string;
106
+ devicesAddNew: string;
107
+ devicesRename: string;
108
+ devicesRevoke: string;
109
+ devicesUvEnabled: string;
110
+ devicesAddedOn: string;
111
+ devicesLastUsed: string;
112
+ devicesConfirmRevoke: string;
113
+ devicesErrorLoad: string;
114
+ devicesErrorUpdate: string;
115
+ devicesErrorRevoke: string;
116
+ devicePairTitle: string;
117
+ devicePairSubtitle: string;
118
+ devicePairCodeLabel: string;
119
+ devicePairCodePlaceholder: string;
120
+ devicePairDeviceNameLabel: string;
121
+ devicePairDeviceNamePlaceholder: string;
122
+ devicePairConfirm: string;
123
+ devicePairConfirming: string;
124
+ devicePairSuccess: string;
125
+ devicePairBack: string;
126
+ devicePairErrorCodeRequired: string;
127
+ devicePairErrorNotFound: string;
128
+ devicePairErrorGeneric: string;
129
+ passkeyNotSupported: string;
130
+ passkeyCancelled: string;
131
+ passkeyAlreadyRegistered: string;
132
+ passkeyNoMatchingAuthenticator: string;
133
+ passkeyAuthenticatorNotSupported: string;
134
+ passkeyRegistrationCancelled: string;
135
+ passkeyAuthenticationCancelled: string;
136
+ }
137
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,26 @@
1
+ import type { AuthenticationResponseJSON, PublicKeyCredentialCreationOptionsJSON, PublicKeyCredentialRequestOptionsJSON, RegistrationResponseJSON } from '@simplewebauthn/browser';
2
+ import { type AuthUiLabels } from './contracts.js';
3
+ export interface AuthUiWebAuthnBrowser {
4
+ PublicKeyCredential?: {
5
+ new (...args: never[]): unknown;
6
+ isUserVerifyingPlatformAuthenticatorAvailable?: () => Promise<boolean>;
7
+ };
8
+ }
9
+ export interface StartPasskeyRegistrationOptions {
10
+ browser?: AuthUiWebAuthnBrowser;
11
+ startRegistration?: (input: {
12
+ optionsJSON: PublicKeyCredentialCreationOptionsJSON;
13
+ }) => Promise<RegistrationResponseJSON>;
14
+ }
15
+ export interface StartPasskeyAuthenticationOptions {
16
+ browser?: AuthUiWebAuthnBrowser;
17
+ startAuthentication?: (input: {
18
+ optionsJSON: PublicKeyCredentialRequestOptionsJSON;
19
+ }) => Promise<AuthenticationResponseJSON>;
20
+ }
21
+ export declare const isWebAuthnSupported: (browser?: AuthUiWebAuthnBrowser | undefined) => boolean;
22
+ export declare const isPlatformAuthenticatorAvailable: (browser?: AuthUiWebAuthnBrowser | undefined) => Promise<boolean>;
23
+ export declare const startPasskeyRegistration: (options: PublicKeyCredentialCreationOptionsJSON, deps?: StartPasskeyRegistrationOptions) => Promise<RegistrationResponseJSON>;
24
+ export declare const startPasskeyAuthentication: (options: PublicKeyCredentialRequestOptionsJSON, deps?: StartPasskeyAuthenticationOptions) => Promise<AuthenticationResponseJSON>;
25
+ export declare const getWebAuthnErrorMessage: (error: unknown, labels?: Partial<AuthUiLabels>) => string;
26
+ //# sourceMappingURL=webauthn.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webauthn.d.ts","sourceRoot":"","sources":["../src/webauthn.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,0BAA0B,EAC1B,sCAAsC,EACtC,qCAAqC,EACrC,wBAAwB,EACzB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAkE,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEnH,MAAM,WAAW,qBAAqB;IACpC,mBAAmB,CAAC,EAAE;QACpB,KAAK,GAAG,IAAI,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;QAChC,6CAA6C,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;KACxE,CAAC;CACH;AAED,MAAM,WAAW,+BAA+B;IAC9C,OAAO,CAAC,EAAE,qBAAqB,CAAC;IAChC,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,WAAW,EAAE,sCAAsC,CAAA;KAAE,KAAK,OAAO,CAAC,wBAAwB,CAAC,CAAC;CAC3H;AAED,MAAM,WAAW,iCAAiC;IAChD,OAAO,CAAC,EAAE,qBAAqB,CAAC;IAChC,mBAAmB,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,WAAW,EAAE,qCAAqC,CAAA;KAAE,KAAK,OAAO,CAAC,0BAA0B,CAAC,CAAC;CAC9H;AAKD,eAAO,MAAM,mBAAmB,aAAa,qBAAqB,GAAG,SAAS,KAAyB,OACnD,CAAC;AAErD,eAAO,MAAM,gCAAgC,aAClC,qBAAqB,GAAG,SAAS,KACzC,QAAQ,OAAO,CAUjB,CAAC;AAEF,eAAO,MAAM,wBAAwB,YAC1B,sCAAsC,SACzC,+BAA+B,KACpC,QAAQ,wBAAwB,CAUlC,CAAC;AAEF,eAAO,MAAM,0BAA0B,YAC5B,qCAAqC,SACxC,iCAAiC,KACtC,QAAQ,0BAA0B,CAUpC,CAAC;AAEF,eAAO,MAAM,uBAAuB,UAC3B,OAAO,WACN,QAAQ,YAAY,CAAC,KAC5B,MAoBF,CAAC"}
@@ -0,0 +1,76 @@
1
+ import { startAuthentication as defaultStartAuthentication, startRegistration as defaultStartRegistration } from '@simplewebauthn/browser';
2
+ import { createAuthUiError, createDefaultAuthUiLabels } from './contracts.js';
3
+ const getDefaultBrowser = () => typeof window === 'undefined' ? undefined : window;
4
+ export const isWebAuthnSupported = (browser = getDefaultBrowser()) => typeof browser?.PublicKeyCredential === 'function';
5
+ export const isPlatformAuthenticatorAvailable = async (browser = getDefaultBrowser()) => {
6
+ if (!isWebAuthnSupported(browser)) {
7
+ return false;
8
+ }
9
+ try {
10
+ return Boolean(await browser?.PublicKeyCredential?.isUserVerifyingPlatformAuthenticatorAvailable?.());
11
+ }
12
+ catch {
13
+ return false;
14
+ }
15
+ };
16
+ export const startPasskeyRegistration = async (options, deps = {}) => {
17
+ if (!isWebAuthnSupported(deps.browser)) {
18
+ throw createAuthUiError('passkey_not_supported', 'WebAuthn is not supported in this browser');
19
+ }
20
+ try {
21
+ return await (deps.startRegistration ?? defaultStartRegistration)({ optionsJSON: options });
22
+ }
23
+ catch (error) {
24
+ throw mapWebAuthnError(error, 'registration');
25
+ }
26
+ };
27
+ export const startPasskeyAuthentication = async (options, deps = {}) => {
28
+ if (!isWebAuthnSupported(deps.browser)) {
29
+ throw createAuthUiError('passkey_not_supported', 'WebAuthn is not supported in this browser');
30
+ }
31
+ try {
32
+ return await (deps.startAuthentication ?? defaultStartAuthentication)({ optionsJSON: options });
33
+ }
34
+ catch (error) {
35
+ throw mapWebAuthnError(error, 'authentication');
36
+ }
37
+ };
38
+ export const getWebAuthnErrorMessage = (error, labels = createDefaultAuthUiLabels()) => {
39
+ if (typeof error === 'string') {
40
+ return error;
41
+ }
42
+ const code = error?.code;
43
+ const message = error?.message ?? 'Unknown error';
44
+ switch (code) {
45
+ case 'passkey_cancelled':
46
+ return labels.passkeyCancelled ?? message;
47
+ case 'passkey_already_registered':
48
+ return labels.passkeyAlreadyRegistered ?? message;
49
+ case 'passkey_no_matching_authenticator':
50
+ return labels.passkeyNoMatchingAuthenticator ?? message;
51
+ case 'passkey_not_supported':
52
+ return labels.passkeyNotSupported ?? message;
53
+ default:
54
+ return message;
55
+ }
56
+ };
57
+ const mapWebAuthnError = (error, ceremony) => {
58
+ const name = error?.name;
59
+ const message = error?.message ?? 'Unknown error';
60
+ if (name === 'NotAllowedError') {
61
+ return createAuthUiError('passkey_cancelled', ceremony === 'registration' ? 'Registration cancelled by user' : 'Authentication cancelled by user', { retryable: true, cause: error });
62
+ }
63
+ if (name === 'InvalidStateError') {
64
+ const code = ceremony === 'registration' ? 'passkey_already_registered' : 'passkey_no_matching_authenticator';
65
+ const fallback = ceremony === 'registration' ? 'This authenticator is already registered' : 'No matching authenticator found';
66
+ return createAuthUiError(code, fallback, { retryable: ceremony !== 'registration', cause: error });
67
+ }
68
+ if (name === 'NotSupportedError') {
69
+ return createAuthUiError('passkey_not_supported', 'This authenticator is not supported', {
70
+ retryable: false,
71
+ cause: error,
72
+ });
73
+ }
74
+ return createAuthUiError(ceremony === 'registration' ? 'passkey_registration_failed' : 'passkey_authentication_failed', `${ceremony === 'registration' ? 'Registration' : 'Authentication'} failed: ${message}`, { retryable: true, cause: error });
75
+ };
76
+ //# sourceMappingURL=webauthn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webauthn.js","sourceRoot":"","sources":["../src/webauthn.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,86 @@
1
+ {
2
+ "name": "@sentropic/auth-ui",
3
+ "version": "0.2.0",
4
+ "description": "Reusable Svelte authentication UI contracts and browser passkey helpers for Sentropic-compatible apps.",
5
+ "type": "module",
6
+ "license": "MIT",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/rhanka/sentropic.git",
10
+ "directory": "packages/auth-ui"
11
+ },
12
+ "main": "./src/index.ts",
13
+ "types": "./src/index.ts",
14
+ "exports": {
15
+ ".": {
16
+ "types": "./src/index.ts",
17
+ "svelte": "./src/index.ts",
18
+ "import": "./src/index.ts"
19
+ },
20
+ "./contracts": {
21
+ "types": "./src/contracts.ts",
22
+ "svelte": "./src/contracts.ts",
23
+ "import": "./src/contracts.ts"
24
+ },
25
+ "./webauthn": {
26
+ "types": "./src/webauthn.ts",
27
+ "svelte": "./src/webauthn.ts",
28
+ "import": "./src/webauthn.ts"
29
+ },
30
+ "./transport-fetch": {
31
+ "types": "./src/transport-fetch.ts",
32
+ "svelte": "./src/transport-fetch.ts",
33
+ "import": "./src/transport-fetch.ts"
34
+ },
35
+ "./components/AuthLogin.svelte": {
36
+ "types": "./src/components/AuthLogin.svelte.d.ts",
37
+ "svelte": "./src/components/AuthLogin.svelte",
38
+ "import": "./src/components/AuthLogin.svelte"
39
+ },
40
+ "./components/AuthRegister.svelte": {
41
+ "types": "./src/components/AuthRegister.svelte.d.ts",
42
+ "svelte": "./src/components/AuthRegister.svelte",
43
+ "import": "./src/components/AuthRegister.svelte"
44
+ },
45
+ "./components/AuthMagicLinkVerify.svelte": {
46
+ "types": "./src/components/AuthMagicLinkVerify.svelte.d.ts",
47
+ "svelte": "./src/components/AuthMagicLinkVerify.svelte",
48
+ "import": "./src/components/AuthMagicLinkVerify.svelte"
49
+ },
50
+ "./components/AuthDevices.svelte": {
51
+ "types": "./src/components/AuthDevices.svelte.d.ts",
52
+ "svelte": "./src/components/AuthDevices.svelte",
53
+ "import": "./src/components/AuthDevices.svelte"
54
+ },
55
+ "./components/AuthDevicePair.svelte": {
56
+ "types": "./src/components/AuthDevicePair.svelte.d.ts",
57
+ "svelte": "./src/components/AuthDevicePair.svelte",
58
+ "import": "./src/components/AuthDevicePair.svelte"
59
+ }
60
+ },
61
+ "files": [
62
+ "dist",
63
+ "src",
64
+ "README.md",
65
+ "LICENSE"
66
+ ],
67
+ "publishConfig": {
68
+ "access": "public"
69
+ },
70
+ "sideEffects": [
71
+ "**/*.svelte"
72
+ ],
73
+ "scripts": {
74
+ "build": "tsc -p tsconfig.json",
75
+ "typecheck": "tsc --noEmit -p tsconfig.json",
76
+ "test": "vitest run tests"
77
+ },
78
+ "peerDependencies": {
79
+ "@simplewebauthn/browser": "^13.2.2",
80
+ "svelte": "^5.0.0"
81
+ },
82
+ "devDependencies": {
83
+ "@simplewebauthn/browser": "^13.2.2",
84
+ "typescript": "5.4.5"
85
+ }
86
+ }