@adatechnology/user-contracts 0.1.0-rc.1
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/dist/index.cjs +295 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +395 -0
- package/dist/index.d.ts +395 -0
- package/dist/index.js +250 -0
- package/dist/index.js.map +1 -0
- package/package.json +35 -0
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,395 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Copyright (c) 2026 Ada Technology. All rights reserved.
|
|
5
|
+
*
|
|
6
|
+
* This source code is proprietary and confidential. Unauthorized copying,
|
|
7
|
+
* modification, distribution, or use of this file, via any medium, is
|
|
8
|
+
* strictly prohibited without prior written permission from Ada Technology.
|
|
9
|
+
*/
|
|
10
|
+
type UserProfile = {
|
|
11
|
+
readonly id: string;
|
|
12
|
+
readonly email: string;
|
|
13
|
+
readonly name: string;
|
|
14
|
+
readonly role: string;
|
|
15
|
+
readonly companyId?: string;
|
|
16
|
+
readonly isActive: boolean;
|
|
17
|
+
readonly lastSeenAt?: Date;
|
|
18
|
+
};
|
|
19
|
+
type UserSession = {
|
|
20
|
+
readonly accessToken: string;
|
|
21
|
+
readonly expiresInSeconds: number;
|
|
22
|
+
readonly refreshToken: string;
|
|
23
|
+
readonly refreshExpiresInSeconds: number;
|
|
24
|
+
readonly user: UserProfile;
|
|
25
|
+
};
|
|
26
|
+
type SessionStatus = 'unknown' | 'anonymous' | 'authenticated';
|
|
27
|
+
type PaginatedResponse<T> = {
|
|
28
|
+
readonly data: readonly T[];
|
|
29
|
+
readonly pagination: {
|
|
30
|
+
readonly total: number;
|
|
31
|
+
readonly page: number;
|
|
32
|
+
readonly perPage: number;
|
|
33
|
+
};
|
|
34
|
+
};
|
|
35
|
+
type ListUsersParams = {
|
|
36
|
+
readonly page?: number;
|
|
37
|
+
readonly perPage?: number;
|
|
38
|
+
readonly companyId?: string;
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Copyright (c) 2026 Ada Technology. All rights reserved.
|
|
43
|
+
*
|
|
44
|
+
* This source code is proprietary and confidential. Unauthorized copying,
|
|
45
|
+
* modification, distribution, or use of this file, via any medium, is
|
|
46
|
+
* strictly prohibited without prior written permission from Ada Technology.
|
|
47
|
+
*/
|
|
48
|
+
declare const USER_ERROR_CODE: {
|
|
49
|
+
readonly INVALID_CREDENTIALS: "USER_INVALID_CREDENTIALS";
|
|
50
|
+
readonly USER_NOT_FOUND: "USER_NOT_FOUND";
|
|
51
|
+
readonly EMAIL_ALREADY_EXISTS: "USER_EMAIL_ALREADY_EXISTS";
|
|
52
|
+
readonly NOT_AUTHENTICATED: "USER_NOT_AUTHENTICATED";
|
|
53
|
+
readonly RESET_TOKEN_INVALID: "USER_RESET_TOKEN_INVALID";
|
|
54
|
+
readonly RESET_TOKEN_EXPIRED: "USER_RESET_TOKEN_EXPIRED";
|
|
55
|
+
readonly RESET_TOKEN_ALREADY_USED: "USER_RESET_TOKEN_ALREADY_USED";
|
|
56
|
+
readonly WEAK_PASSWORD: "USER_WEAK_PASSWORD";
|
|
57
|
+
readonly PROVIDER_MISCONFIGURED: "USER_PROVIDER_MISCONFIGURED";
|
|
58
|
+
readonly PROVIDER_DISABLED: "USER_PROVIDER_DISABLED";
|
|
59
|
+
readonly CONFIG_MISSING: "USER_CONFIG_MISSING";
|
|
60
|
+
};
|
|
61
|
+
type UserErrorCode = (typeof USER_ERROR_CODE)[keyof typeof USER_ERROR_CODE];
|
|
62
|
+
declare class UserError extends Error {
|
|
63
|
+
readonly statusCode: number;
|
|
64
|
+
readonly code: UserErrorCode;
|
|
65
|
+
readonly details?: unknown;
|
|
66
|
+
constructor(params: {
|
|
67
|
+
message: string;
|
|
68
|
+
statusCode: number;
|
|
69
|
+
code: UserErrorCode;
|
|
70
|
+
details?: unknown;
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
declare class InvalidCredentialsError extends UserError {
|
|
74
|
+
constructor();
|
|
75
|
+
}
|
|
76
|
+
declare class UserNotFoundError extends UserError {
|
|
77
|
+
constructor();
|
|
78
|
+
}
|
|
79
|
+
declare class EmailAlreadyExistsError extends UserError {
|
|
80
|
+
constructor();
|
|
81
|
+
}
|
|
82
|
+
declare class NotAuthenticatedError extends UserError {
|
|
83
|
+
constructor();
|
|
84
|
+
}
|
|
85
|
+
declare class ResetTokenInvalidError extends UserError {
|
|
86
|
+
constructor();
|
|
87
|
+
}
|
|
88
|
+
declare class ResetTokenExpiredError extends UserError {
|
|
89
|
+
constructor();
|
|
90
|
+
}
|
|
91
|
+
declare class ResetTokenAlreadyUsedError extends UserError {
|
|
92
|
+
constructor();
|
|
93
|
+
}
|
|
94
|
+
declare class WeakPasswordError extends UserError {
|
|
95
|
+
constructor();
|
|
96
|
+
}
|
|
97
|
+
declare class ProviderMisconfiguredError extends UserError {
|
|
98
|
+
constructor(details?: unknown);
|
|
99
|
+
}
|
|
100
|
+
declare class ProviderDisabledError extends UserError {
|
|
101
|
+
constructor();
|
|
102
|
+
}
|
|
103
|
+
declare class ConfigMissingError extends UserError {
|
|
104
|
+
constructor(field: string);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Copyright (c) 2026 Ada Technology. All rights reserved.
|
|
109
|
+
*
|
|
110
|
+
* This source code is proprietary and confidential. Unauthorized copying,
|
|
111
|
+
* modification, distribution, or use of this file, via any medium, is
|
|
112
|
+
* strictly prohibited without prior written permission from Ada Technology.
|
|
113
|
+
*/
|
|
114
|
+
|
|
115
|
+
declare const USER_EVENT: {
|
|
116
|
+
readonly USER_CREATED: "user.user.created";
|
|
117
|
+
readonly USER_UPDATED: "user.user.updated";
|
|
118
|
+
readonly LOGIN_SUCCEEDED: "user.login.succeeded";
|
|
119
|
+
readonly LOGIN_FAILED: "user.login.failed";
|
|
120
|
+
readonly PASSWORD_CHANGED: "user.password.changed";
|
|
121
|
+
readonly PASSWORD_RESET_REQUESTED: "user.password_reset.requested";
|
|
122
|
+
readonly PASSWORD_RESET_COMPLETED: "user.password_reset.completed";
|
|
123
|
+
readonly PROFILE_UPDATED: "user.profile.updated";
|
|
124
|
+
};
|
|
125
|
+
type UserEventType = (typeof USER_EVENT)[keyof typeof USER_EVENT];
|
|
126
|
+
type BaseEvent = {
|
|
127
|
+
readonly companyId?: string;
|
|
128
|
+
readonly occurredAt: Date;
|
|
129
|
+
};
|
|
130
|
+
type UserCreatedEvent = BaseEvent & {
|
|
131
|
+
readonly type: typeof USER_EVENT.USER_CREATED;
|
|
132
|
+
readonly userId: string;
|
|
133
|
+
readonly email: string;
|
|
134
|
+
};
|
|
135
|
+
type UserUpdatedEvent = BaseEvent & {
|
|
136
|
+
readonly type: typeof USER_EVENT.USER_UPDATED;
|
|
137
|
+
readonly userId: string;
|
|
138
|
+
readonly user: UserProfile;
|
|
139
|
+
};
|
|
140
|
+
type LoginSucceededEvent = BaseEvent & {
|
|
141
|
+
readonly type: typeof USER_EVENT.LOGIN_SUCCEEDED;
|
|
142
|
+
readonly userId: string;
|
|
143
|
+
readonly email: string;
|
|
144
|
+
readonly ipAddress: string;
|
|
145
|
+
};
|
|
146
|
+
type LoginFailedEvent = BaseEvent & {
|
|
147
|
+
readonly type: typeof USER_EVENT.LOGIN_FAILED;
|
|
148
|
+
readonly email: string;
|
|
149
|
+
readonly ipAddress: string;
|
|
150
|
+
readonly reason: string;
|
|
151
|
+
};
|
|
152
|
+
type PasswordChangedEvent = BaseEvent & {
|
|
153
|
+
readonly type: typeof USER_EVENT.PASSWORD_CHANGED;
|
|
154
|
+
readonly userId: string;
|
|
155
|
+
};
|
|
156
|
+
type PasswordResetRequestedEvent = BaseEvent & {
|
|
157
|
+
readonly type: typeof USER_EVENT.PASSWORD_RESET_REQUESTED;
|
|
158
|
+
readonly email: string;
|
|
159
|
+
readonly resetUrl: string;
|
|
160
|
+
};
|
|
161
|
+
type PasswordResetCompletedEvent = BaseEvent & {
|
|
162
|
+
readonly type: typeof USER_EVENT.PASSWORD_RESET_COMPLETED;
|
|
163
|
+
readonly userId: string;
|
|
164
|
+
readonly email: string;
|
|
165
|
+
};
|
|
166
|
+
type ProfileUpdatedEvent = BaseEvent & {
|
|
167
|
+
readonly type: typeof USER_EVENT.PROFILE_UPDATED;
|
|
168
|
+
readonly userId: string;
|
|
169
|
+
readonly user: UserProfile;
|
|
170
|
+
};
|
|
171
|
+
type UserDomainEvent = UserCreatedEvent | UserUpdatedEvent | LoginSucceededEvent | LoginFailedEvent | PasswordChangedEvent | PasswordResetRequestedEvent | PasswordResetCompletedEvent | ProfileUpdatedEvent;
|
|
172
|
+
type UserHooks = {
|
|
173
|
+
readonly onUserCreated?: (event: UserCreatedEvent) => Promise<void> | void;
|
|
174
|
+
readonly onUserUpdated?: (event: UserUpdatedEvent) => Promise<void> | void;
|
|
175
|
+
readonly onLoginSucceeded?: (event: LoginSucceededEvent) => Promise<void> | void;
|
|
176
|
+
readonly onLoginFailed?: (event: LoginFailedEvent) => Promise<void> | void;
|
|
177
|
+
readonly onPasswordChanged?: (event: PasswordChangedEvent) => Promise<void> | void;
|
|
178
|
+
readonly onPasswordResetRequested?: (event: PasswordResetRequestedEvent) => Promise<void> | void;
|
|
179
|
+
readonly onPasswordResetCompleted?: (event: PasswordResetCompletedEvent) => Promise<void> | void;
|
|
180
|
+
readonly onProfileUpdated?: (event: ProfileUpdatedEvent) => Promise<void> | void;
|
|
181
|
+
};
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* Copyright (c) 2026 Ada Technology. All rights reserved.
|
|
185
|
+
*
|
|
186
|
+
* This source code is proprietary and confidential. Unauthorized copying,
|
|
187
|
+
* modification, distribution, or use of this file, via any medium, is
|
|
188
|
+
* strictly prohibited without prior written permission from Ada Technology.
|
|
189
|
+
*/
|
|
190
|
+
|
|
191
|
+
declare const AUTH_PROVIDER_TYPE: {
|
|
192
|
+
readonly LOCAL: "local";
|
|
193
|
+
readonly OAUTH2: "oauth2";
|
|
194
|
+
readonly OIDC: "oidc";
|
|
195
|
+
};
|
|
196
|
+
type AuthProviderType = (typeof AUTH_PROVIDER_TYPE)[keyof typeof AUTH_PROVIDER_TYPE];
|
|
197
|
+
type AuthProviderInterface<TCredentials = unknown> = {
|
|
198
|
+
readonly id: string;
|
|
199
|
+
readonly type: AuthProviderType;
|
|
200
|
+
authenticate(params: {
|
|
201
|
+
readonly credentials: TCredentials;
|
|
202
|
+
readonly ipAddress?: string;
|
|
203
|
+
}): Promise<UserSession>;
|
|
204
|
+
};
|
|
205
|
+
type AttributeMappingRule<TClaims extends Record<string, unknown>> = {
|
|
206
|
+
readonly from: keyof TClaims;
|
|
207
|
+
} | {
|
|
208
|
+
readonly value: string;
|
|
209
|
+
};
|
|
210
|
+
type AttributeMapping<TClaims extends Record<string, unknown>> = {
|
|
211
|
+
readonly email: AttributeMappingRule<TClaims>;
|
|
212
|
+
readonly name?: AttributeMappingRule<TClaims>;
|
|
213
|
+
readonly role?: AttributeMappingRule<TClaims>;
|
|
214
|
+
};
|
|
215
|
+
/**
|
|
216
|
+
* `issue` devolve o token cru; `rotate`/`revoke` recebem o **sha256 hex** dele — o token cru nunca
|
|
217
|
+
* chega ao armazenamento, então um dump do Redis ou da tabela não vale sessão.
|
|
218
|
+
*
|
|
219
|
+
* `revokeAllForUser` é o que faz uma troca de senha realmente encerrar as sessões abertas. Sem ela,
|
|
220
|
+
* a sessão comprometida sobrevive à redefinição feita justamente para matá-la — por isso é
|
|
221
|
+
* obrigatória no contrato, e não uma capacidade opcional.
|
|
222
|
+
*/
|
|
223
|
+
type RefreshTokenStorePort = {
|
|
224
|
+
issue(params: {
|
|
225
|
+
readonly userId: string;
|
|
226
|
+
readonly expiresInSeconds: number;
|
|
227
|
+
}): Promise<string>;
|
|
228
|
+
rotate(params: {
|
|
229
|
+
readonly tokenHash: string;
|
|
230
|
+
readonly newExpiresInSeconds: number;
|
|
231
|
+
}): Promise<{
|
|
232
|
+
readonly token: string;
|
|
233
|
+
readonly userId: string;
|
|
234
|
+
} | null>;
|
|
235
|
+
revoke(params: {
|
|
236
|
+
readonly tokenHash: string;
|
|
237
|
+
}): Promise<void>;
|
|
238
|
+
revokeAllForUser(params: {
|
|
239
|
+
readonly userId: string;
|
|
240
|
+
}): Promise<void>;
|
|
241
|
+
};
|
|
242
|
+
type SendEmailParams = {
|
|
243
|
+
readonly to: string;
|
|
244
|
+
readonly subject: string;
|
|
245
|
+
readonly body: string;
|
|
246
|
+
readonly html?: string;
|
|
247
|
+
};
|
|
248
|
+
type DeliveryAttemptResult = {
|
|
249
|
+
readonly success: boolean;
|
|
250
|
+
readonly messageId?: string;
|
|
251
|
+
readonly error?: string;
|
|
252
|
+
};
|
|
253
|
+
type EmailDriverPort = {
|
|
254
|
+
readonly driver: string;
|
|
255
|
+
send(params: SendEmailParams): Promise<DeliveryAttemptResult>;
|
|
256
|
+
};
|
|
257
|
+
type ClockPort = {
|
|
258
|
+
now(): Date;
|
|
259
|
+
};
|
|
260
|
+
type LogMeta = Readonly<Record<string, unknown>>;
|
|
261
|
+
/** Mesma forma do `LoggerPort` dos outros contratos do ecossistema — o host escreve um adapter só. */
|
|
262
|
+
type LoggerPort = {
|
|
263
|
+
error(message: string, meta?: LogMeta): void;
|
|
264
|
+
warn(message: string, meta?: LogMeta): void;
|
|
265
|
+
info(message: string, meta?: LogMeta): void;
|
|
266
|
+
debug(message: string, meta?: LogMeta): void;
|
|
267
|
+
};
|
|
268
|
+
type TenancyConfig = {
|
|
269
|
+
readonly mode: 'single';
|
|
270
|
+
readonly defaultCompanyId: string;
|
|
271
|
+
} | {
|
|
272
|
+
readonly mode: 'multi';
|
|
273
|
+
};
|
|
274
|
+
/**
|
|
275
|
+
* `issuer`/`audience` são opcionais, mas quando declarados valem na assinatura **e** na
|
|
276
|
+
* verificação: um token emitido para outra plateia é recusado. Um host que já emite JWT por conta
|
|
277
|
+
* própria (migração gradual, dois emissores sobre o mesmo segredo) precisa declarar os mesmos
|
|
278
|
+
* valores aqui, ou os dois lados não reconhecem o token um do outro.
|
|
279
|
+
*/
|
|
280
|
+
type AccessTokenConfig = {
|
|
281
|
+
readonly secret: string;
|
|
282
|
+
readonly expiresInSeconds?: number;
|
|
283
|
+
readonly issuer?: string;
|
|
284
|
+
readonly audience?: string;
|
|
285
|
+
};
|
|
286
|
+
type RefreshTokenConfig = {
|
|
287
|
+
readonly expiresInSeconds?: number;
|
|
288
|
+
};
|
|
289
|
+
type PasswordResetConfig = {
|
|
290
|
+
readonly resetUrlTemplate: string;
|
|
291
|
+
readonly tokenExpiresInSeconds?: number;
|
|
292
|
+
};
|
|
293
|
+
type KeycloakConfig = {
|
|
294
|
+
readonly realm: string;
|
|
295
|
+
readonly authServerUrl: string;
|
|
296
|
+
readonly clientId: string;
|
|
297
|
+
readonly clientSecret?: string;
|
|
298
|
+
readonly attributeMapping?: AttributeMapping<Record<string, unknown>>;
|
|
299
|
+
};
|
|
300
|
+
type UserModuleConfig = {
|
|
301
|
+
readonly tenancy: TenancyConfig;
|
|
302
|
+
readonly accessToken: AccessTokenConfig;
|
|
303
|
+
readonly refreshToken?: RefreshTokenConfig;
|
|
304
|
+
readonly passwordReset?: PasswordResetConfig;
|
|
305
|
+
readonly keycloak?: KeycloakConfig;
|
|
306
|
+
};
|
|
307
|
+
/**
|
|
308
|
+
* `keycloak` não entra aqui: a verificação de token é plumbing específico do módulo (ver
|
|
309
|
+
* `KeycloakVerifierPort` em `user-module`), não um contrato genérico reutilizável por outro host.
|
|
310
|
+
*/
|
|
311
|
+
type UserModuleProviders = {
|
|
312
|
+
readonly refreshTokenStore?: RefreshTokenStorePort;
|
|
313
|
+
readonly email?: EmailDriverPort;
|
|
314
|
+
readonly clock?: ClockPort;
|
|
315
|
+
readonly logger?: LoggerPort;
|
|
316
|
+
};
|
|
317
|
+
|
|
318
|
+
/**
|
|
319
|
+
* Copyright (c) 2026 Ada Technology. All rights reserved.
|
|
320
|
+
*
|
|
321
|
+
* This source code is proprietary and confidential. Unauthorized copying,
|
|
322
|
+
* modification, distribution, or use of this file, via any medium, is
|
|
323
|
+
* strictly prohibited without prior written permission from Ada Technology.
|
|
324
|
+
*/
|
|
325
|
+
|
|
326
|
+
declare const localCredentialsSchema: z.ZodObject<{
|
|
327
|
+
email: z.ZodString;
|
|
328
|
+
password: z.ZodString;
|
|
329
|
+
}, "strip", z.ZodTypeAny, {
|
|
330
|
+
email: string;
|
|
331
|
+
password: string;
|
|
332
|
+
}, {
|
|
333
|
+
email: string;
|
|
334
|
+
password: string;
|
|
335
|
+
}>;
|
|
336
|
+
type LocalCredentials = z.infer<typeof localCredentialsSchema>;
|
|
337
|
+
declare const requestPasswordResetSchema: z.ZodObject<{
|
|
338
|
+
email: z.ZodString;
|
|
339
|
+
}, "strip", z.ZodTypeAny, {
|
|
340
|
+
email: string;
|
|
341
|
+
}, {
|
|
342
|
+
email: string;
|
|
343
|
+
}>;
|
|
344
|
+
type RequestPasswordResetInput = z.infer<typeof requestPasswordResetSchema>;
|
|
345
|
+
declare const confirmPasswordResetSchema: z.ZodObject<{
|
|
346
|
+
token: z.ZodString;
|
|
347
|
+
newPassword: z.ZodString;
|
|
348
|
+
}, "strip", z.ZodTypeAny, {
|
|
349
|
+
token: string;
|
|
350
|
+
newPassword: string;
|
|
351
|
+
}, {
|
|
352
|
+
token: string;
|
|
353
|
+
newPassword: string;
|
|
354
|
+
}>;
|
|
355
|
+
type ConfirmPasswordResetInput = z.infer<typeof confirmPasswordResetSchema>;
|
|
356
|
+
declare const updateProfileSchema: z.ZodObject<{
|
|
357
|
+
name: z.ZodOptional<z.ZodString>;
|
|
358
|
+
}, "strip", z.ZodTypeAny, {
|
|
359
|
+
name?: string | undefined;
|
|
360
|
+
}, {
|
|
361
|
+
name?: string | undefined;
|
|
362
|
+
}>;
|
|
363
|
+
type UpdateProfileInput = z.infer<typeof updateProfileSchema>;
|
|
364
|
+
declare const createUserSchema: z.ZodObject<{
|
|
365
|
+
email: z.ZodString;
|
|
366
|
+
name: z.ZodString;
|
|
367
|
+
password: z.ZodString;
|
|
368
|
+
role: z.ZodString;
|
|
369
|
+
}, "strip", z.ZodTypeAny, {
|
|
370
|
+
email: string;
|
|
371
|
+
password: string;
|
|
372
|
+
name: string;
|
|
373
|
+
role: string;
|
|
374
|
+
}, {
|
|
375
|
+
email: string;
|
|
376
|
+
password: string;
|
|
377
|
+
name: string;
|
|
378
|
+
role: string;
|
|
379
|
+
}>;
|
|
380
|
+
type CreateUserInput = z.infer<typeof createUserSchema>;
|
|
381
|
+
/**
|
|
382
|
+
* `accessToken`, não `code`/`state`: o módulo verifica localmente um token já emitido pelo
|
|
383
|
+
* Keycloak (`@adatechnology/auth-keycloak`, verificação via JWKS) — a troca do `code` da
|
|
384
|
+
* authorization code flow é responsabilidade do host/frontend, antes de chegar aqui.
|
|
385
|
+
*/
|
|
386
|
+
declare const keycloakCallbackSchema: z.ZodObject<{
|
|
387
|
+
accessToken: z.ZodString;
|
|
388
|
+
}, "strip", z.ZodTypeAny, {
|
|
389
|
+
accessToken: string;
|
|
390
|
+
}, {
|
|
391
|
+
accessToken: string;
|
|
392
|
+
}>;
|
|
393
|
+
type KeycloakCallbackInput = z.infer<typeof keycloakCallbackSchema>;
|
|
394
|
+
|
|
395
|
+
export { AUTH_PROVIDER_TYPE, type AccessTokenConfig, type AttributeMapping, type AttributeMappingRule, type AuthProviderInterface, type AuthProviderType, type BaseEvent, type ClockPort, ConfigMissingError, type ConfirmPasswordResetInput, type CreateUserInput, type DeliveryAttemptResult, EmailAlreadyExistsError, type EmailDriverPort, InvalidCredentialsError, type KeycloakCallbackInput, type KeycloakConfig, type ListUsersParams, type LocalCredentials, type LogMeta, type LoggerPort, type LoginFailedEvent, type LoginSucceededEvent, NotAuthenticatedError, type PaginatedResponse, type PasswordChangedEvent, type PasswordResetCompletedEvent, type PasswordResetConfig, type PasswordResetRequestedEvent, type ProfileUpdatedEvent, ProviderDisabledError, ProviderMisconfiguredError, type RefreshTokenConfig, type RefreshTokenStorePort, type RequestPasswordResetInput, ResetTokenAlreadyUsedError, ResetTokenExpiredError, ResetTokenInvalidError, type SendEmailParams, type SessionStatus, type TenancyConfig, USER_ERROR_CODE, USER_EVENT, type UpdateProfileInput, type UserCreatedEvent, type UserDomainEvent, UserError, type UserErrorCode, type UserEventType, type UserHooks, type UserModuleConfig, type UserModuleProviders, UserNotFoundError, type UserProfile, type UserSession, type UserUpdatedEvent, WeakPasswordError, confirmPasswordResetSchema, createUserSchema, keycloakCallbackSchema, localCredentialsSchema, requestPasswordResetSchema, updateProfileSchema };
|