@trymellon/js 1.1.3

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.
@@ -0,0 +1,364 @@
1
+ type Result<T, E> = {
2
+ ok: true;
3
+ value: T;
4
+ } | {
5
+ ok: false;
6
+ error: E;
7
+ };
8
+
9
+ type TryMellonErrorCode = 'NOT_SUPPORTED' | 'USER_CANCELLED' | 'PASSKEY_NOT_FOUND' | 'SESSION_EXPIRED' | 'NETWORK_FAILURE' | 'INVALID_ARGUMENT' | 'TIMEOUT' | 'ABORTED' | 'UNKNOWN_ERROR';
10
+ declare class TryMellonError extends Error {
11
+ readonly code: TryMellonErrorCode;
12
+ readonly details?: unknown;
13
+ readonly isTryMellonError = true;
14
+ constructor(code: TryMellonErrorCode, message: string, details?: unknown);
15
+ }
16
+
17
+ interface HttpClient {
18
+ get<T>(url: string, headers?: Record<string, string>): Promise<Result<T, TryMellonError>>;
19
+ post<T>(url: string, body: unknown, headers?: Record<string, string>): Promise<Result<T, TryMellonError>>;
20
+ }
21
+
22
+ interface Logger {
23
+ debug(message: string, meta?: Record<string, unknown>): void;
24
+ info(message: string, meta?: Record<string, unknown>): void;
25
+ warn(message: string, meta?: Record<string, unknown>): void;
26
+ error(message: string, meta?: Record<string, unknown>): void;
27
+ }
28
+
29
+ type TelemetryEvent = 'register' | 'authenticate';
30
+ type TelemetryPayload = {
31
+ event: TelemetryEvent;
32
+ latencyMs: number;
33
+ ok: true;
34
+ };
35
+ interface TelemetrySender {
36
+ send(payload: TelemetryPayload): Promise<void>;
37
+ }
38
+
39
+ type TryMellonConfig = {
40
+ /** Application identifier (tenant). Required for API requests. */
41
+ appId: string;
42
+ /** API key for authentication. Required for API requests. */
43
+ publishableKey: string;
44
+ apiBaseUrl?: string;
45
+ timeoutMs?: number;
46
+ maxRetries?: number;
47
+ retryDelayMs?: number;
48
+ /** Optional logger for request/error correlation (e.g. requestId). */
49
+ logger?: Logger;
50
+ /** If true, send anonymous telemetry (event + latency) after successful register/authenticate. */
51
+ enableTelemetry?: boolean;
52
+ /** Custom telemetry sender; used when enableTelemetry is true. Defaults to TryMellon endpoint. */
53
+ telemetrySender?: TelemetrySender;
54
+ /** Endpoint for default telemetry sender when enableTelemetry is true and telemetrySender not set. */
55
+ telemetryEndpoint?: string;
56
+ };
57
+ type RegisterOptions = {
58
+ /** User identifier (recommended: camelCase). */
59
+ externalUserId?: string;
60
+ /** User identifier (snake_case alias). */
61
+ external_user_id?: string;
62
+ authenticatorType?: 'platform' | 'cross-platform';
63
+ signal?: AbortSignal;
64
+ };
65
+ type RegisterResult = {
66
+ success: true;
67
+ credential_id: string;
68
+ status: string;
69
+ session_token: string;
70
+ user: {
71
+ user_id: string;
72
+ external_user_id: string;
73
+ email?: string;
74
+ metadata?: Record<string, unknown>;
75
+ };
76
+ };
77
+ type AuthenticateOptions = {
78
+ /** User identifier (recommended: camelCase). */
79
+ externalUserId?: string;
80
+ /** User identifier (snake_case alias). */
81
+ external_user_id?: string;
82
+ hint?: string;
83
+ signal?: AbortSignal;
84
+ /** Conditional UI mediation for passkey autofill / conditional UI. */
85
+ mediation?: 'optional' | 'conditional' | 'required';
86
+ };
87
+ type AuthenticateResult = {
88
+ authenticated: boolean;
89
+ session_token: string;
90
+ user: {
91
+ user_id: string;
92
+ external_user_id: string;
93
+ email?: string;
94
+ metadata?: Record<string, unknown>;
95
+ };
96
+ signals: {
97
+ userVerification?: boolean;
98
+ backupEligible?: boolean;
99
+ backupStatus?: boolean;
100
+ };
101
+ };
102
+ type ClientStatus = {
103
+ isPasskeySupported: boolean;
104
+ platformAuthenticatorAvailable: boolean;
105
+ recommendedFlow: 'passkey' | 'fallback';
106
+ };
107
+ type TryMellonEvent = 'start' | 'success' | 'error' | 'cancelled';
108
+ type EventPayload = {
109
+ type: 'start';
110
+ operation: 'register' | 'authenticate';
111
+ } | {
112
+ type: 'success';
113
+ operation: 'register' | 'authenticate';
114
+ } | {
115
+ type: 'error';
116
+ error: TryMellonError;
117
+ } | {
118
+ type: 'cancelled';
119
+ operation: 'register' | 'authenticate';
120
+ };
121
+ type EventHandler = (payload: EventPayload) => void;
122
+ type EmailFallbackStartOptions = {
123
+ userId: string;
124
+ };
125
+ type EmailFallbackVerifyOptions = {
126
+ userId: string;
127
+ code: string;
128
+ };
129
+ type EmailFallbackVerifyResult = {
130
+ sessionToken: string;
131
+ };
132
+ type OnboardingStartOptions = {
133
+ user_role: 'maintainer' | 'app_user';
134
+ };
135
+ type OnboardingCompleteResult = {
136
+ session_id: string;
137
+ status: 'completed';
138
+ user_id: string;
139
+ tenant_id: string;
140
+ session_token: string;
141
+ };
142
+ type RegisterStartRequest = {
143
+ external_user_id: string;
144
+ };
145
+ type AuthStartRequest = {
146
+ external_user_id: string;
147
+ };
148
+ type RegisterFinishRequest = {
149
+ session_id: string;
150
+ credential: {
151
+ id: string;
152
+ rawId: string;
153
+ response: {
154
+ clientDataJSON: string;
155
+ attestationObject: string;
156
+ };
157
+ type: 'public-key';
158
+ };
159
+ };
160
+ type AuthFinishRequest = {
161
+ session_id: string;
162
+ credential: {
163
+ id: string;
164
+ rawId: string;
165
+ response: {
166
+ authenticatorData: string;
167
+ clientDataJSON: string;
168
+ signature: string;
169
+ userHandle?: string;
170
+ };
171
+ type: 'public-key';
172
+ };
173
+ };
174
+ type RegisterStartResponse = {
175
+ challenge: {
176
+ rp: {
177
+ name: string;
178
+ id: string;
179
+ };
180
+ user: {
181
+ id: string;
182
+ name: string;
183
+ displayName: string;
184
+ };
185
+ challenge: string;
186
+ pubKeyCredParams: Array<{
187
+ type: 'public-key';
188
+ alg: number;
189
+ }>;
190
+ timeout?: number;
191
+ excludeCredentials?: Array<{
192
+ id: string;
193
+ type: 'public-key';
194
+ transports?: string[];
195
+ }>;
196
+ authenticatorSelection?: {
197
+ userVerification?: 'required' | 'preferred' | 'discouraged';
198
+ residentKey?: 'required' | 'preferred' | 'discouraged';
199
+ authenticatorAttachment?: 'platform' | 'cross-platform';
200
+ };
201
+ };
202
+ session_id: string;
203
+ };
204
+ type AuthStartResponse = {
205
+ challenge: {
206
+ challenge: string;
207
+ rpId: string;
208
+ allowCredentials: Array<{
209
+ id: string;
210
+ type: 'public-key';
211
+ transports?: string[];
212
+ }>;
213
+ timeout?: number;
214
+ userVerification?: 'required' | 'preferred' | 'discouraged';
215
+ };
216
+ session_id: string;
217
+ };
218
+ type RegisterFinishResponse = {
219
+ credential_id: string;
220
+ status: string;
221
+ session_token: string;
222
+ user: {
223
+ user_id: string;
224
+ external_user_id: string;
225
+ email?: string;
226
+ metadata?: Record<string, unknown>;
227
+ };
228
+ };
229
+ type AuthFinishResponse = {
230
+ authenticated: boolean;
231
+ user: {
232
+ user_id: string;
233
+ external_user_id: string;
234
+ email?: string;
235
+ metadata?: Record<string, unknown>;
236
+ };
237
+ signals: {
238
+ userVerification?: boolean;
239
+ backupEligible?: boolean;
240
+ backupStatus?: boolean;
241
+ };
242
+ session_token: string;
243
+ };
244
+ type SessionValidateResponse = {
245
+ valid: boolean;
246
+ user_id: string;
247
+ external_user_id: string;
248
+ tenant_id: string;
249
+ app_id: string;
250
+ };
251
+ type OnboardingStartRequest = {
252
+ user_role: 'maintainer' | 'app_user';
253
+ };
254
+ type OnboardingStartResponse = {
255
+ session_id: string;
256
+ onboarding_url: string;
257
+ expires_in: number;
258
+ };
259
+ type OnboardingStatusResponse = {
260
+ status: 'pending_passkey' | 'pending_data' | 'completed';
261
+ onboarding_url: string;
262
+ expires_in: number;
263
+ };
264
+ type OnboardingRegisterResponse = {
265
+ session_id: string;
266
+ status: 'pending_passkey';
267
+ onboarding_url: string;
268
+ };
269
+ type OnboardingRegisterPasskeyRequest = {
270
+ credential: {
271
+ id: string;
272
+ rawId: string;
273
+ response: {
274
+ clientDataJSON: string;
275
+ attestationObject: string;
276
+ };
277
+ type: 'public-key';
278
+ };
279
+ tenant_id?: string;
280
+ challenge: string;
281
+ };
282
+ type OnboardingRegisterPasskeyResponse = {
283
+ session_id: string;
284
+ status: 'pending_data' | 'completed';
285
+ user_id: string;
286
+ tenant_id: string;
287
+ };
288
+ type OnboardingCompleteRequest = {
289
+ company_name?: string;
290
+ };
291
+ type OnboardingCompleteResponse = {
292
+ session_id: string;
293
+ status: 'completed';
294
+ user_id: string;
295
+ tenant_id: string;
296
+ session_token: string;
297
+ };
298
+
299
+ /** Response may include optional challenge for same-device passkey registration */
300
+ type OnboardingRegisterResponseWithChallenge = OnboardingRegisterResponse & {
301
+ challenge?: RegisterStartResponse['challenge'];
302
+ };
303
+
304
+ declare class ApiClient {
305
+ private readonly httpClient;
306
+ private readonly baseUrl;
307
+ private readonly defaultHeaders;
308
+ constructor(httpClient: HttpClient, baseUrl: string, defaultHeaders?: Record<string, string>);
309
+ private mergeHeaders;
310
+ private post;
311
+ private get;
312
+ startRegister(request: RegisterStartRequest): Promise<Result<RegisterStartResponse, TryMellonError>>;
313
+ startAuth(request: AuthStartRequest): Promise<Result<AuthStartResponse, TryMellonError>>;
314
+ finishRegister(request: RegisterFinishRequest): Promise<Result<RegisterFinishResponse, TryMellonError>>;
315
+ finishAuth(request: AuthFinishRequest): Promise<Result<AuthFinishResponse, TryMellonError>>;
316
+ validateSession(sessionToken: string): Promise<Result<SessionValidateResponse, TryMellonError>>;
317
+ startEmailFallback(userId: string): Promise<Result<void, TryMellonError>>;
318
+ verifyEmailCode(userId: string, code: string): Promise<Result<{
319
+ sessionToken: string;
320
+ }, TryMellonError>>;
321
+ startOnboarding(request: OnboardingStartRequest): Promise<Result<OnboardingStartResponse, TryMellonError>>;
322
+ getOnboardingStatus(sessionId: string): Promise<Result<OnboardingStatusResponse, TryMellonError>>;
323
+ getOnboardingRegister(sessionId: string): Promise<Result<OnboardingRegisterResponseWithChallenge, TryMellonError>>;
324
+ registerOnboardingPasskey(sessionId: string, request: OnboardingRegisterPasskeyRequest): Promise<Result<OnboardingRegisterPasskeyResponse, TryMellonError>>;
325
+ completeOnboarding(sessionId: string, request: OnboardingCompleteRequest): Promise<Result<OnboardingCompleteResponse, TryMellonError>>;
326
+ }
327
+
328
+ declare class OnboardingManager {
329
+ private readonly apiClient;
330
+ constructor(apiClient: ApiClient);
331
+ /**
332
+ * Executes the full onboarding flow in a single call.
333
+ * 1. Starts onboarding
334
+ * 2. Polls for 'pending_passkey' or 'completed' status
335
+ * 3. If pending_passkey: when API returns challenge, registers passkey (WebAuthn) then completes onboarding
336
+ * 4. If pending_passkey but API does not return challenge: returns NOT_SUPPORTED with onboarding_url for user to complete elsewhere
337
+ */
338
+ startFlow(options: OnboardingStartOptions & {
339
+ company_name?: string;
340
+ }): Promise<Result<OnboardingCompleteResult, TryMellonError>>;
341
+ }
342
+
343
+ declare class TryMellon {
344
+ private apiClient;
345
+ private eventEmitter;
346
+ private telemetrySender;
347
+ onboarding: OnboardingManager;
348
+ constructor(config: TryMellonConfig);
349
+ static isSupported(): boolean;
350
+ register(options: RegisterOptions): Promise<Result<RegisterResult, TryMellonError>>;
351
+ authenticate(options: AuthenticateOptions): Promise<Result<AuthenticateResult, TryMellonError>>;
352
+ validateSession(sessionToken: string): Promise<Result<SessionValidateResponse, TryMellonError>>;
353
+ getStatus(): Promise<ClientStatus>;
354
+ on(event: TryMellonEvent, handler: EventHandler): () => void;
355
+ version(): string;
356
+ fallback: {
357
+ email: {
358
+ start: (options: EmailFallbackStartOptions) => Promise<Result<void, TryMellonError>>;
359
+ verify: (options: EmailFallbackVerifyOptions) => Promise<Result<EmailFallbackVerifyResult, TryMellonError>>;
360
+ };
361
+ };
362
+ }
363
+
364
+ export { type AuthenticateResult as A, type Result as R, TryMellon as T, type RegisterResult as a, TryMellonError as b, type RegisterOptions as c, type AuthenticateOptions as d, type TryMellonConfig as e };
package/dist/vue.cjs ADDED
@@ -0,0 +1,3 @@
1
+ "use client";
2
+ "use strict";var c=Object.defineProperty;var M=Object.getOwnPropertyDescriptor;var T=Object.getOwnPropertyNames;var v=Object.prototype.hasOwnProperty;var g=(r,e)=>{for(var t in e)c(r,t,{get:e[t],enumerable:!0})},h=(r,e,t,l)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of T(e))!v.call(r,o)&&o!==t&&c(r,o,{get:()=>e[o],enumerable:!(l=M(e,o))||l.enumerable});return r};var E=r=>h(c({},"__esModule",{value:!0}),r);var x={};g(x,{TryMellonKey:()=>i,provideTryMellon:()=>f,useAuthenticate:()=>R,useRegister:()=>m,useTryMellon:()=>u});module.exports=E(x);var s=require("vue"),i=Symbol("TryMellon");function f(r){(0,s.provide)(i,r)}function u(){let r=(0,s.inject)(i);if(r==null)throw new Error("useTryMellon must be used within a component that has received tryMellon via provideTryMellon");return r}var y=require("vue");function m(){let r=u(),e=(0,y.ref)(null),t=(0,y.ref)(!1),l=(0,y.ref)(null);async function o(a){t.value=!0,l.value=null,e.value=null;let n=await r.register(a);return e.value=n,t.value=!1,l.value=n.ok?null:n.error,n}return{result:e,loading:t,error:l,execute:o}}var p=require("vue");function R(){let r=u(),e=(0,p.ref)(null),t=(0,p.ref)(!1),l=(0,p.ref)(null);async function o(a){t.value=!0,l.value=null,e.value=null;let n=await r.authenticate(a);return e.value=n,t.value=!1,l.value=n.ok?null:n.error,n}return{result:e,loading:t,error:l,execute:o}}0&&(module.exports={TryMellonKey,provideTryMellon,useAuthenticate,useRegister,useTryMellon});
3
+ //# sourceMappingURL=vue.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/vue/index.ts","../src/vue/context.ts","../src/vue/use-register.ts","../src/vue/use-authenticate.ts"],"sourcesContent":["export { provideTryMellon, useTryMellon, TryMellonKey } from './context';\nexport { useRegister } from './use-register';\nexport { useAuthenticate } from './use-authenticate';\n","import { inject, provide, type InjectionKey } from 'vue';\nimport type { TryMellon } from '../core/trymellon';\n\nexport const TryMellonKey: InjectionKey<TryMellon> = Symbol('TryMellon');\n\nexport function provideTryMellon(client: TryMellon): void {\n provide(TryMellonKey, client);\n}\n\nexport function useTryMellon(): TryMellon {\n const client = inject(TryMellonKey);\n if (client == null) {\n throw new Error(\n 'useTryMellon must be used within a component that has received tryMellon via provideTryMellon'\n );\n }\n return client;\n}\n","import { ref, type Ref } from 'vue';\nimport { useTryMellon } from './context';\nimport type { RegisterOptions, RegisterResult } from '../types';\nimport type { TryMellonError } from '../errors';\nimport type { Result } from '../utils/result';\n\nexport function useRegister(): {\n result: Ref<Result<RegisterResult, TryMellonError> | null>;\n loading: Ref<boolean>;\n error: Ref<TryMellonError | null>;\n execute: (options: RegisterOptions) => Promise<Result<RegisterResult, TryMellonError>>;\n} {\n const client = useTryMellon();\n const result = ref<Result<RegisterResult, TryMellonError> | null>(null);\n const loading = ref(false);\n const error = ref<TryMellonError | null>(null);\n\n async function execute(options: RegisterOptions) {\n loading.value = true;\n error.value = null;\n result.value = null;\n const res = await client.register(options);\n result.value = res;\n loading.value = false;\n error.value = res.ok ? null : res.error;\n return res;\n }\n\n return { result, loading, error, execute };\n}\n","import { ref, type Ref } from 'vue';\nimport { useTryMellon } from './context';\nimport type { AuthenticateOptions, AuthenticateResult } from '../types';\nimport type { TryMellonError } from '../errors';\nimport type { Result } from '../utils/result';\n\nexport function useAuthenticate(): {\n result: Ref<Result<AuthenticateResult, TryMellonError> | null>;\n loading: Ref<boolean>;\n error: Ref<TryMellonError | null>;\n execute: (options: AuthenticateOptions) => Promise<Result<AuthenticateResult, TryMellonError>>;\n} {\n const client = useTryMellon();\n const result = ref<Result<AuthenticateResult, TryMellonError> | null>(null);\n const loading = ref(false);\n const error = ref<TryMellonError | null>(null);\n\n async function execute(options: AuthenticateOptions) {\n loading.value = true;\n error.value = null;\n result.value = null;\n const res = await client.authenticate(options);\n result.value = res;\n loading.value = false;\n error.value = res.ok ? null : res.error;\n return res;\n }\n\n return { result, loading, error, execute };\n}\n"],"mappings":";yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,kBAAAE,EAAA,qBAAAC,EAAA,oBAAAC,EAAA,gBAAAC,EAAA,iBAAAC,IAAA,eAAAC,EAAAP,GCAA,IAAAQ,EAAmD,eAGtCC,EAAwC,OAAO,WAAW,EAEhE,SAASC,EAAiBC,EAAyB,IACxD,WAAQF,EAAcE,CAAM,CAC9B,CAEO,SAASC,GAA0B,CACxC,IAAMD,KAAS,UAAOF,CAAY,EAClC,GAAIE,GAAU,KACZ,MAAM,IAAI,MACR,+FACF,EAEF,OAAOA,CACT,CCjBA,IAAAE,EAA8B,eAMvB,SAASC,GAKd,CACA,IAAMC,EAASC,EAAa,EACtBC,KAAS,OAAmD,IAAI,EAChEC,KAAU,OAAI,EAAK,EACnBC,KAAQ,OAA2B,IAAI,EAE7C,eAAeC,EAAQC,EAA0B,CAC/CH,EAAQ,MAAQ,GAChBC,EAAM,MAAQ,KACdF,EAAO,MAAQ,KACf,IAAMK,EAAM,MAAMP,EAAO,SAASM,CAAO,EACzC,OAAAJ,EAAO,MAAQK,EACfJ,EAAQ,MAAQ,GAChBC,EAAM,MAAQG,EAAI,GAAK,KAAOA,EAAI,MAC3BA,CACT,CAEA,MAAO,CAAE,OAAAL,EAAQ,QAAAC,EAAS,MAAAC,EAAO,QAAAC,CAAQ,CAC3C,CC7BA,IAAAG,EAA8B,eAMvB,SAASC,GAKd,CACA,IAAMC,EAASC,EAAa,EACtBC,KAAS,OAAuD,IAAI,EACpEC,KAAU,OAAI,EAAK,EACnBC,KAAQ,OAA2B,IAAI,EAE7C,eAAeC,EAAQC,EAA8B,CACnDH,EAAQ,MAAQ,GAChBC,EAAM,MAAQ,KACdF,EAAO,MAAQ,KACf,IAAMK,EAAM,MAAMP,EAAO,aAAaM,CAAO,EAC7C,OAAAJ,EAAO,MAAQK,EACfJ,EAAQ,MAAQ,GAChBC,EAAM,MAAQG,EAAI,GAAK,KAAOA,EAAI,MAC3BA,CACT,CAEA,MAAO,CAAE,OAAAL,EAAQ,QAAAC,EAAS,MAAAC,EAAO,QAAAC,CAAQ,CAC3C","names":["vue_exports","__export","TryMellonKey","provideTryMellon","useAuthenticate","useRegister","useTryMellon","__toCommonJS","import_vue","TryMellonKey","provideTryMellon","client","useTryMellon","import_vue","useRegister","client","useTryMellon","result","loading","error","execute","options","res","import_vue","useAuthenticate","client","useTryMellon","result","loading","error","execute","options","res"]}
package/dist/vue.d.cts ADDED
@@ -0,0 +1,22 @@
1
+ import { InjectionKey, Ref } from 'vue';
2
+ import { T as TryMellon, R as Result, a as RegisterResult, b as TryMellonError, c as RegisterOptions, A as AuthenticateResult, d as AuthenticateOptions } from './trymellon-Ca4kob_K.cjs';
3
+
4
+ declare const TryMellonKey: InjectionKey<TryMellon>;
5
+ declare function provideTryMellon(client: TryMellon): void;
6
+ declare function useTryMellon(): TryMellon;
7
+
8
+ declare function useRegister(): {
9
+ result: Ref<Result<RegisterResult, TryMellonError> | null>;
10
+ loading: Ref<boolean>;
11
+ error: Ref<TryMellonError | null>;
12
+ execute: (options: RegisterOptions) => Promise<Result<RegisterResult, TryMellonError>>;
13
+ };
14
+
15
+ declare function useAuthenticate(): {
16
+ result: Ref<Result<AuthenticateResult, TryMellonError> | null>;
17
+ loading: Ref<boolean>;
18
+ error: Ref<TryMellonError | null>;
19
+ execute: (options: AuthenticateOptions) => Promise<Result<AuthenticateResult, TryMellonError>>;
20
+ };
21
+
22
+ export { TryMellonKey, provideTryMellon, useAuthenticate, useRegister, useTryMellon };
package/dist/vue.d.ts ADDED
@@ -0,0 +1,22 @@
1
+ import { InjectionKey, Ref } from 'vue';
2
+ import { T as TryMellon, R as Result, a as RegisterResult, b as TryMellonError, c as RegisterOptions, A as AuthenticateResult, d as AuthenticateOptions } from './trymellon-Ca4kob_K.js';
3
+
4
+ declare const TryMellonKey: InjectionKey<TryMellon>;
5
+ declare function provideTryMellon(client: TryMellon): void;
6
+ declare function useTryMellon(): TryMellon;
7
+
8
+ declare function useRegister(): {
9
+ result: Ref<Result<RegisterResult, TryMellonError> | null>;
10
+ loading: Ref<boolean>;
11
+ error: Ref<TryMellonError | null>;
12
+ execute: (options: RegisterOptions) => Promise<Result<RegisterResult, TryMellonError>>;
13
+ };
14
+
15
+ declare function useAuthenticate(): {
16
+ result: Ref<Result<AuthenticateResult, TryMellonError> | null>;
17
+ loading: Ref<boolean>;
18
+ error: Ref<TryMellonError | null>;
19
+ execute: (options: AuthenticateOptions) => Promise<Result<AuthenticateResult, TryMellonError>>;
20
+ };
21
+
22
+ export { TryMellonKey, provideTryMellon, useAuthenticate, useRegister, useTryMellon };
package/dist/vue.js ADDED
@@ -0,0 +1,3 @@
1
+ "use client";
2
+ import{inject as a,provide as c}from"vue";var i=Symbol("TryMellon");function f(r){c(i,r)}function n(){let r=a(i);if(r==null)throw new Error("useTryMellon must be used within a component that has received tryMellon via provideTryMellon");return r}import{ref as y}from"vue";function m(){let r=n(),t=y(null),l=y(!1),o=y(null);async function u(s){l.value=!0,o.value=null,t.value=null;let e=await r.register(s);return t.value=e,l.value=!1,o.value=e.ok?null:e.error,e}return{result:t,loading:l,error:o,execute:u}}import{ref as p}from"vue";function R(){let r=n(),t=p(null),l=p(!1),o=p(null);async function u(s){l.value=!0,o.value=null,t.value=null;let e=await r.authenticate(s);return t.value=e,l.value=!1,o.value=e.ok?null:e.error,e}return{result:t,loading:l,error:o,execute:u}}export{i as TryMellonKey,f as provideTryMellon,R as useAuthenticate,m as useRegister,n as useTryMellon};
3
+ //# sourceMappingURL=vue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/vue/context.ts","../src/vue/use-register.ts","../src/vue/use-authenticate.ts"],"sourcesContent":["import { inject, provide, type InjectionKey } from 'vue';\nimport type { TryMellon } from '../core/trymellon';\n\nexport const TryMellonKey: InjectionKey<TryMellon> = Symbol('TryMellon');\n\nexport function provideTryMellon(client: TryMellon): void {\n provide(TryMellonKey, client);\n}\n\nexport function useTryMellon(): TryMellon {\n const client = inject(TryMellonKey);\n if (client == null) {\n throw new Error(\n 'useTryMellon must be used within a component that has received tryMellon via provideTryMellon'\n );\n }\n return client;\n}\n","import { ref, type Ref } from 'vue';\nimport { useTryMellon } from './context';\nimport type { RegisterOptions, RegisterResult } from '../types';\nimport type { TryMellonError } from '../errors';\nimport type { Result } from '../utils/result';\n\nexport function useRegister(): {\n result: Ref<Result<RegisterResult, TryMellonError> | null>;\n loading: Ref<boolean>;\n error: Ref<TryMellonError | null>;\n execute: (options: RegisterOptions) => Promise<Result<RegisterResult, TryMellonError>>;\n} {\n const client = useTryMellon();\n const result = ref<Result<RegisterResult, TryMellonError> | null>(null);\n const loading = ref(false);\n const error = ref<TryMellonError | null>(null);\n\n async function execute(options: RegisterOptions) {\n loading.value = true;\n error.value = null;\n result.value = null;\n const res = await client.register(options);\n result.value = res;\n loading.value = false;\n error.value = res.ok ? null : res.error;\n return res;\n }\n\n return { result, loading, error, execute };\n}\n","import { ref, type Ref } from 'vue';\nimport { useTryMellon } from './context';\nimport type { AuthenticateOptions, AuthenticateResult } from '../types';\nimport type { TryMellonError } from '../errors';\nimport type { Result } from '../utils/result';\n\nexport function useAuthenticate(): {\n result: Ref<Result<AuthenticateResult, TryMellonError> | null>;\n loading: Ref<boolean>;\n error: Ref<TryMellonError | null>;\n execute: (options: AuthenticateOptions) => Promise<Result<AuthenticateResult, TryMellonError>>;\n} {\n const client = useTryMellon();\n const result = ref<Result<AuthenticateResult, TryMellonError> | null>(null);\n const loading = ref(false);\n const error = ref<TryMellonError | null>(null);\n\n async function execute(options: AuthenticateOptions) {\n loading.value = true;\n error.value = null;\n result.value = null;\n const res = await client.authenticate(options);\n result.value = res;\n loading.value = false;\n error.value = res.ok ? null : res.error;\n return res;\n }\n\n return { result, loading, error, execute };\n}\n"],"mappings":";AAAA,OAAS,UAAAA,EAAQ,WAAAC,MAAkC,MAG5C,IAAMC,EAAwC,OAAO,WAAW,EAEhE,SAASC,EAAiBC,EAAyB,CACxDH,EAAQC,EAAcE,CAAM,CAC9B,CAEO,SAASC,GAA0B,CACxC,IAAMD,EAASJ,EAAOE,CAAY,EAClC,GAAIE,GAAU,KACZ,MAAM,IAAI,MACR,+FACF,EAEF,OAAOA,CACT,CCjBA,OAAS,OAAAE,MAAqB,MAMvB,SAASC,GAKd,CACA,IAAMC,EAASC,EAAa,EACtBC,EAASC,EAAmD,IAAI,EAChEC,EAAUD,EAAI,EAAK,EACnBE,EAAQF,EAA2B,IAAI,EAE7C,eAAeG,EAAQC,EAA0B,CAC/CH,EAAQ,MAAQ,GAChBC,EAAM,MAAQ,KACdH,EAAO,MAAQ,KACf,IAAMM,EAAM,MAAMR,EAAO,SAASO,CAAO,EACzC,OAAAL,EAAO,MAAQM,EACfJ,EAAQ,MAAQ,GAChBC,EAAM,MAAQG,EAAI,GAAK,KAAOA,EAAI,MAC3BA,CACT,CAEA,MAAO,CAAE,OAAAN,EAAQ,QAAAE,EAAS,MAAAC,EAAO,QAAAC,CAAQ,CAC3C,CC7BA,OAAS,OAAAG,MAAqB,MAMvB,SAASC,GAKd,CACA,IAAMC,EAASC,EAAa,EACtBC,EAASC,EAAuD,IAAI,EACpEC,EAAUD,EAAI,EAAK,EACnBE,EAAQF,EAA2B,IAAI,EAE7C,eAAeG,EAAQC,EAA8B,CACnDH,EAAQ,MAAQ,GAChBC,EAAM,MAAQ,KACdH,EAAO,MAAQ,KACf,IAAMM,EAAM,MAAMR,EAAO,aAAaO,CAAO,EAC7C,OAAAL,EAAO,MAAQM,EACfJ,EAAQ,MAAQ,GAChBC,EAAM,MAAQG,EAAI,GAAK,KAAOA,EAAI,MAC3BA,CACT,CAEA,MAAO,CAAE,OAAAN,EAAQ,QAAAE,EAAS,MAAAC,EAAO,QAAAC,CAAQ,CAC3C","names":["inject","provide","TryMellonKey","provideTryMellon","client","useTryMellon","ref","useRegister","client","useTryMellon","result","ref","loading","error","execute","options","res","ref","useAuthenticate","client","useTryMellon","result","ref","loading","error","execute","options","res"]}
package/package.json ADDED
@@ -0,0 +1,121 @@
1
+ {
2
+ "name": "@trymellon/js",
3
+ "version": "1.1.3",
4
+ "description": "SDK oficial de TryMellon para integrar autenticación passwordless con Passkeys / WebAuthn",
5
+ "type": "module",
6
+ "main": "./dist/index.cjs",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "sideEffects": false,
10
+ "exports": {
11
+ ".": {
12
+ "types": "./dist/index.d.ts",
13
+ "import": "./dist/index.js",
14
+ "require": "./dist/index.cjs",
15
+ "default": "./dist/index.js"
16
+ },
17
+ "./react": {
18
+ "types": "./dist/react.d.ts",
19
+ "import": "./dist/react.js",
20
+ "require": "./dist/react.cjs",
21
+ "default": "./dist/react.js"
22
+ },
23
+ "./vue": {
24
+ "types": "./dist/vue.d.ts",
25
+ "import": "./dist/vue.js",
26
+ "require": "./dist/vue.cjs",
27
+ "default": "./dist/vue.js"
28
+ },
29
+ "./angular": {
30
+ "types": "./dist/angular.d.ts",
31
+ "import": "./dist/angular.js",
32
+ "require": "./dist/angular.cjs",
33
+ "default": "./dist/angular.js"
34
+ },
35
+ "./umd": {
36
+ "types": "./dist/index.d.ts",
37
+ "default": "./dist/index.global.js"
38
+ },
39
+ "./package.json": "./package.json"
40
+ },
41
+ "files": [
42
+ "dist",
43
+ "README.md",
44
+ "LICENSE"
45
+ ],
46
+ "publishConfig": {
47
+ "access": "public"
48
+ },
49
+ "scripts": {
50
+ "build": "node -e \"require('fs').rmSync('dist', { recursive: true, force: true })\" && tsup",
51
+ "dev": "tsup --watch",
52
+ "test": "vitest run",
53
+ "test:watch": "vitest",
54
+ "test:coverage": "vitest run --coverage",
55
+ "test:angular": "npm run build && vitest run --config vitest.angular.config.ts",
56
+ "lint": "eslint .",
57
+ "lint:fix": "eslint . --fix",
58
+ "lint:workflows": "node scripts/run-actionlint.cjs .github/workflows",
59
+ "format": "prettier --write \"**/*.{ts,js,json,md}\"",
60
+ "format:check": "prettier --check \"**/*.{ts,js,json,md}\"",
61
+ "typecheck": "tsc --noEmit",
62
+ "prepublishOnly": "npm run build && npm run typecheck && npm run lint",
63
+ "prepare": "npm run build",
64
+ "sri": "node scripts/sri.js",
65
+ "audit:ci": "audit-ci --config audit-ci.jsonc",
66
+ "test:e2e": "playwright test",
67
+ "semantic-release": "semantic-release"
68
+ },
69
+ "keywords": [
70
+ "webauthn",
71
+ "passkeys",
72
+ "passwordless",
73
+ "authentication",
74
+ "sdk",
75
+ "trymellon"
76
+ ],
77
+ "author": "TryMellon",
78
+ "license": "MIT",
79
+ "repository": {
80
+ "type": "git",
81
+ "url": "https://github.com/ResakaGit/trymellon-js.git"
82
+ },
83
+ "engines": {
84
+ "node": ">=18.0.0"
85
+ },
86
+ "browserslist": [
87
+ ">0.5%",
88
+ "last 2 versions",
89
+ "not dead",
90
+ "iOS >= 14"
91
+ ],
92
+ "devDependencies": {
93
+ "@angular/core": "^19.2.18",
94
+ "@angular/platform-browser-dynamic": "^19.2.18",
95
+ "@playwright/test": "^1.49.0",
96
+ "@semantic-release/changelog": "^6.0.3",
97
+ "@semantic-release/git": "^10.0.1",
98
+ "@testing-library/react": "^16.3.2",
99
+ "@types/node": "^20.11.0",
100
+ "@types/react": "^19.2.13",
101
+ "@typescript-eslint/eslint-plugin": "^8.0.0",
102
+ "@typescript-eslint/parser": "^8.0.0",
103
+ "@vitest/coverage-v8": "^1.2.0",
104
+ "@vue/test-utils": "^2.4.6",
105
+ "audit-ci": "^7.1.0",
106
+ "eslint": "^9.0.0",
107
+ "eslint-config-prettier": "^9.1.0",
108
+ "eslint-plugin-prettier": "^5.1.3",
109
+ "jsdom": "^24.0.0",
110
+ "prettier": "^3.2.5",
111
+ "react": "^19.2.4",
112
+ "react-dom": "^19.2.4",
113
+ "semantic-release": "^24.2.9",
114
+ "serve": "^14.2.4",
115
+ "tsup": "^8.0.0",
116
+ "typescript": "^5.3.3",
117
+ "typescript-eslint": "^8.53.0",
118
+ "vitest": "^1.2.0",
119
+ "vue": "^3.5.28"
120
+ }
121
+ }