@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.cjs
ADDED
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
7
|
+
var __export = (target, all) => {
|
|
8
|
+
for (var name in all)
|
|
9
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
10
|
+
};
|
|
11
|
+
var __copyProps = (to, from, except, desc) => {
|
|
12
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
13
|
+
for (let key of __getOwnPropNames(from))
|
|
14
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
15
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
16
|
+
}
|
|
17
|
+
return to;
|
|
18
|
+
};
|
|
19
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
20
|
+
|
|
21
|
+
// src/index.ts
|
|
22
|
+
var index_exports = {};
|
|
23
|
+
__export(index_exports, {
|
|
24
|
+
AUTH_PROVIDER_TYPE: () => AUTH_PROVIDER_TYPE,
|
|
25
|
+
ConfigMissingError: () => ConfigMissingError,
|
|
26
|
+
EmailAlreadyExistsError: () => EmailAlreadyExistsError,
|
|
27
|
+
InvalidCredentialsError: () => InvalidCredentialsError,
|
|
28
|
+
NotAuthenticatedError: () => NotAuthenticatedError,
|
|
29
|
+
ProviderDisabledError: () => ProviderDisabledError,
|
|
30
|
+
ProviderMisconfiguredError: () => ProviderMisconfiguredError,
|
|
31
|
+
ResetTokenAlreadyUsedError: () => ResetTokenAlreadyUsedError,
|
|
32
|
+
ResetTokenExpiredError: () => ResetTokenExpiredError,
|
|
33
|
+
ResetTokenInvalidError: () => ResetTokenInvalidError,
|
|
34
|
+
USER_ERROR_CODE: () => USER_ERROR_CODE,
|
|
35
|
+
USER_EVENT: () => USER_EVENT,
|
|
36
|
+
UserError: () => UserError,
|
|
37
|
+
UserNotFoundError: () => UserNotFoundError,
|
|
38
|
+
WeakPasswordError: () => WeakPasswordError,
|
|
39
|
+
confirmPasswordResetSchema: () => confirmPasswordResetSchema,
|
|
40
|
+
createUserSchema: () => createUserSchema,
|
|
41
|
+
keycloakCallbackSchema: () => keycloakCallbackSchema,
|
|
42
|
+
localCredentialsSchema: () => localCredentialsSchema,
|
|
43
|
+
requestPasswordResetSchema: () => requestPasswordResetSchema,
|
|
44
|
+
updateProfileSchema: () => updateProfileSchema
|
|
45
|
+
});
|
|
46
|
+
module.exports = __toCommonJS(index_exports);
|
|
47
|
+
|
|
48
|
+
// src/errors.ts
|
|
49
|
+
var USER_ERROR_CODE = {
|
|
50
|
+
INVALID_CREDENTIALS: "USER_INVALID_CREDENTIALS",
|
|
51
|
+
USER_NOT_FOUND: "USER_NOT_FOUND",
|
|
52
|
+
EMAIL_ALREADY_EXISTS: "USER_EMAIL_ALREADY_EXISTS",
|
|
53
|
+
NOT_AUTHENTICATED: "USER_NOT_AUTHENTICATED",
|
|
54
|
+
RESET_TOKEN_INVALID: "USER_RESET_TOKEN_INVALID",
|
|
55
|
+
RESET_TOKEN_EXPIRED: "USER_RESET_TOKEN_EXPIRED",
|
|
56
|
+
RESET_TOKEN_ALREADY_USED: "USER_RESET_TOKEN_ALREADY_USED",
|
|
57
|
+
WEAK_PASSWORD: "USER_WEAK_PASSWORD",
|
|
58
|
+
PROVIDER_MISCONFIGURED: "USER_PROVIDER_MISCONFIGURED",
|
|
59
|
+
PROVIDER_DISABLED: "USER_PROVIDER_DISABLED",
|
|
60
|
+
CONFIG_MISSING: "USER_CONFIG_MISSING"
|
|
61
|
+
};
|
|
62
|
+
var UserError = class extends Error {
|
|
63
|
+
static {
|
|
64
|
+
__name(this, "UserError");
|
|
65
|
+
}
|
|
66
|
+
statusCode;
|
|
67
|
+
code;
|
|
68
|
+
details;
|
|
69
|
+
constructor(params) {
|
|
70
|
+
super(params.message);
|
|
71
|
+
this.name = "UserError";
|
|
72
|
+
this.statusCode = params.statusCode;
|
|
73
|
+
this.code = params.code;
|
|
74
|
+
this.details = params.details;
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
var InvalidCredentialsError = class extends UserError {
|
|
78
|
+
static {
|
|
79
|
+
__name(this, "InvalidCredentialsError");
|
|
80
|
+
}
|
|
81
|
+
constructor() {
|
|
82
|
+
super({
|
|
83
|
+
message: "Invalid credentials",
|
|
84
|
+
statusCode: 401,
|
|
85
|
+
code: USER_ERROR_CODE.INVALID_CREDENTIALS
|
|
86
|
+
});
|
|
87
|
+
this.name = "InvalidCredentialsError";
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
var UserNotFoundError = class extends UserError {
|
|
91
|
+
static {
|
|
92
|
+
__name(this, "UserNotFoundError");
|
|
93
|
+
}
|
|
94
|
+
constructor() {
|
|
95
|
+
super({
|
|
96
|
+
message: "User not found",
|
|
97
|
+
statusCode: 404,
|
|
98
|
+
code: USER_ERROR_CODE.USER_NOT_FOUND
|
|
99
|
+
});
|
|
100
|
+
this.name = "UserNotFoundError";
|
|
101
|
+
}
|
|
102
|
+
};
|
|
103
|
+
var EmailAlreadyExistsError = class extends UserError {
|
|
104
|
+
static {
|
|
105
|
+
__name(this, "EmailAlreadyExistsError");
|
|
106
|
+
}
|
|
107
|
+
constructor() {
|
|
108
|
+
super({
|
|
109
|
+
message: "Email already exists",
|
|
110
|
+
statusCode: 409,
|
|
111
|
+
code: USER_ERROR_CODE.EMAIL_ALREADY_EXISTS
|
|
112
|
+
});
|
|
113
|
+
this.name = "EmailAlreadyExistsError";
|
|
114
|
+
}
|
|
115
|
+
};
|
|
116
|
+
var NotAuthenticatedError = class extends UserError {
|
|
117
|
+
static {
|
|
118
|
+
__name(this, "NotAuthenticatedError");
|
|
119
|
+
}
|
|
120
|
+
constructor() {
|
|
121
|
+
super({
|
|
122
|
+
message: "Not authenticated",
|
|
123
|
+
statusCode: 401,
|
|
124
|
+
code: USER_ERROR_CODE.NOT_AUTHENTICATED
|
|
125
|
+
});
|
|
126
|
+
this.name = "NotAuthenticatedError";
|
|
127
|
+
}
|
|
128
|
+
};
|
|
129
|
+
var ResetTokenInvalidError = class extends UserError {
|
|
130
|
+
static {
|
|
131
|
+
__name(this, "ResetTokenInvalidError");
|
|
132
|
+
}
|
|
133
|
+
constructor() {
|
|
134
|
+
super({
|
|
135
|
+
message: "Invalid reset token",
|
|
136
|
+
statusCode: 400,
|
|
137
|
+
code: USER_ERROR_CODE.RESET_TOKEN_INVALID
|
|
138
|
+
});
|
|
139
|
+
this.name = "ResetTokenInvalidError";
|
|
140
|
+
}
|
|
141
|
+
};
|
|
142
|
+
var ResetTokenExpiredError = class extends UserError {
|
|
143
|
+
static {
|
|
144
|
+
__name(this, "ResetTokenExpiredError");
|
|
145
|
+
}
|
|
146
|
+
constructor() {
|
|
147
|
+
super({
|
|
148
|
+
message: "Reset token expired",
|
|
149
|
+
statusCode: 400,
|
|
150
|
+
code: USER_ERROR_CODE.RESET_TOKEN_EXPIRED
|
|
151
|
+
});
|
|
152
|
+
this.name = "ResetTokenExpiredError";
|
|
153
|
+
}
|
|
154
|
+
};
|
|
155
|
+
var ResetTokenAlreadyUsedError = class extends UserError {
|
|
156
|
+
static {
|
|
157
|
+
__name(this, "ResetTokenAlreadyUsedError");
|
|
158
|
+
}
|
|
159
|
+
constructor() {
|
|
160
|
+
super({
|
|
161
|
+
message: "Reset token already used",
|
|
162
|
+
statusCode: 400,
|
|
163
|
+
code: USER_ERROR_CODE.RESET_TOKEN_ALREADY_USED
|
|
164
|
+
});
|
|
165
|
+
this.name = "ResetTokenAlreadyUsedError";
|
|
166
|
+
}
|
|
167
|
+
};
|
|
168
|
+
var WeakPasswordError = class extends UserError {
|
|
169
|
+
static {
|
|
170
|
+
__name(this, "WeakPasswordError");
|
|
171
|
+
}
|
|
172
|
+
constructor() {
|
|
173
|
+
super({
|
|
174
|
+
message: "Password does not meet security requirements",
|
|
175
|
+
statusCode: 400,
|
|
176
|
+
code: USER_ERROR_CODE.WEAK_PASSWORD
|
|
177
|
+
});
|
|
178
|
+
this.name = "WeakPasswordError";
|
|
179
|
+
}
|
|
180
|
+
};
|
|
181
|
+
var ProviderMisconfiguredError = class extends UserError {
|
|
182
|
+
static {
|
|
183
|
+
__name(this, "ProviderMisconfiguredError");
|
|
184
|
+
}
|
|
185
|
+
constructor(details) {
|
|
186
|
+
super({
|
|
187
|
+
message: "Authentication provider is misconfigured",
|
|
188
|
+
statusCode: 500,
|
|
189
|
+
code: USER_ERROR_CODE.PROVIDER_MISCONFIGURED,
|
|
190
|
+
details
|
|
191
|
+
});
|
|
192
|
+
this.name = "ProviderMisconfiguredError";
|
|
193
|
+
}
|
|
194
|
+
};
|
|
195
|
+
var ProviderDisabledError = class extends UserError {
|
|
196
|
+
static {
|
|
197
|
+
__name(this, "ProviderDisabledError");
|
|
198
|
+
}
|
|
199
|
+
constructor() {
|
|
200
|
+
super({
|
|
201
|
+
message: "Authentication provider is not available",
|
|
202
|
+
statusCode: 503,
|
|
203
|
+
code: USER_ERROR_CODE.PROVIDER_DISABLED
|
|
204
|
+
});
|
|
205
|
+
this.name = "ProviderDisabledError";
|
|
206
|
+
}
|
|
207
|
+
};
|
|
208
|
+
var ConfigMissingError = class extends UserError {
|
|
209
|
+
static {
|
|
210
|
+
__name(this, "ConfigMissingError");
|
|
211
|
+
}
|
|
212
|
+
constructor(field) {
|
|
213
|
+
super({
|
|
214
|
+
message: `Missing required configuration: ${field}`,
|
|
215
|
+
statusCode: 500,
|
|
216
|
+
code: USER_ERROR_CODE.CONFIG_MISSING,
|
|
217
|
+
details: {
|
|
218
|
+
field
|
|
219
|
+
}
|
|
220
|
+
});
|
|
221
|
+
this.name = "ConfigMissingError";
|
|
222
|
+
}
|
|
223
|
+
};
|
|
224
|
+
|
|
225
|
+
// src/events.ts
|
|
226
|
+
var USER_EVENT = {
|
|
227
|
+
USER_CREATED: "user.user.created",
|
|
228
|
+
USER_UPDATED: "user.user.updated",
|
|
229
|
+
LOGIN_SUCCEEDED: "user.login.succeeded",
|
|
230
|
+
LOGIN_FAILED: "user.login.failed",
|
|
231
|
+
PASSWORD_CHANGED: "user.password.changed",
|
|
232
|
+
PASSWORD_RESET_REQUESTED: "user.password_reset.requested",
|
|
233
|
+
PASSWORD_RESET_COMPLETED: "user.password_reset.completed",
|
|
234
|
+
PROFILE_UPDATED: "user.profile.updated"
|
|
235
|
+
};
|
|
236
|
+
|
|
237
|
+
// src/providers.ts
|
|
238
|
+
var AUTH_PROVIDER_TYPE = {
|
|
239
|
+
LOCAL: "local",
|
|
240
|
+
OAUTH2: "oauth2",
|
|
241
|
+
OIDC: "oidc"
|
|
242
|
+
};
|
|
243
|
+
|
|
244
|
+
// src/schemas.ts
|
|
245
|
+
var import_zod = require("zod");
|
|
246
|
+
var PASSWORD_MIN_LENGTH = 8;
|
|
247
|
+
var PASSWORD_MAX_LENGTH = 128;
|
|
248
|
+
var localCredentialsSchema = import_zod.z.object({
|
|
249
|
+
email: import_zod.z.string().trim().toLowerCase().email().max(320),
|
|
250
|
+
password: import_zod.z.string().min(PASSWORD_MIN_LENGTH).max(PASSWORD_MAX_LENGTH)
|
|
251
|
+
});
|
|
252
|
+
var requestPasswordResetSchema = import_zod.z.object({
|
|
253
|
+
email: import_zod.z.string().trim().toLowerCase().email().max(320)
|
|
254
|
+
});
|
|
255
|
+
var confirmPasswordResetSchema = import_zod.z.object({
|
|
256
|
+
token: import_zod.z.string().min(1),
|
|
257
|
+
newPassword: import_zod.z.string().min(PASSWORD_MIN_LENGTH).max(PASSWORD_MAX_LENGTH)
|
|
258
|
+
});
|
|
259
|
+
var updateProfileSchema = import_zod.z.object({
|
|
260
|
+
name: import_zod.z.string().trim().min(1).max(255).optional()
|
|
261
|
+
});
|
|
262
|
+
var createUserSchema = import_zod.z.object({
|
|
263
|
+
email: import_zod.z.string().trim().toLowerCase().email().max(320),
|
|
264
|
+
name: import_zod.z.string().trim().min(1).max(255),
|
|
265
|
+
password: import_zod.z.string().min(PASSWORD_MIN_LENGTH).max(PASSWORD_MAX_LENGTH),
|
|
266
|
+
role: import_zod.z.string().min(1).max(40)
|
|
267
|
+
});
|
|
268
|
+
var keycloakCallbackSchema = import_zod.z.object({
|
|
269
|
+
accessToken: import_zod.z.string().min(1)
|
|
270
|
+
});
|
|
271
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
272
|
+
0 && (module.exports = {
|
|
273
|
+
AUTH_PROVIDER_TYPE,
|
|
274
|
+
ConfigMissingError,
|
|
275
|
+
EmailAlreadyExistsError,
|
|
276
|
+
InvalidCredentialsError,
|
|
277
|
+
NotAuthenticatedError,
|
|
278
|
+
ProviderDisabledError,
|
|
279
|
+
ProviderMisconfiguredError,
|
|
280
|
+
ResetTokenAlreadyUsedError,
|
|
281
|
+
ResetTokenExpiredError,
|
|
282
|
+
ResetTokenInvalidError,
|
|
283
|
+
USER_ERROR_CODE,
|
|
284
|
+
USER_EVENT,
|
|
285
|
+
UserError,
|
|
286
|
+
UserNotFoundError,
|
|
287
|
+
WeakPasswordError,
|
|
288
|
+
confirmPasswordResetSchema,
|
|
289
|
+
createUserSchema,
|
|
290
|
+
keycloakCallbackSchema,
|
|
291
|
+
localCredentialsSchema,
|
|
292
|
+
requestPasswordResetSchema,
|
|
293
|
+
updateProfileSchema
|
|
294
|
+
});
|
|
295
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/errors.ts","../src/events.ts","../src/providers.ts","../src/schemas.ts"],"sourcesContent":["/**\n * Copyright (c) 2026 Ada Technology. All rights reserved.\n *\n * This source code is proprietary and confidential. Unauthorized copying,\n * modification, distribution, or use of this file, via any medium, is\n * strictly prohibited without prior written permission from Ada Technology.\n */\n\nexport * from './user.types'\nexport * from './errors'\nexport * from './events'\nexport * from './providers'\nexport * from './schemas'\n","/**\n * Copyright (c) 2026 Ada Technology. All rights reserved.\n *\n * This source code is proprietary and confidential. Unauthorized copying,\n * modification, distribution, or use of this file, via any medium, is\n * strictly prohibited without prior written permission from Ada Technology.\n */\n\nexport const USER_ERROR_CODE = {\n INVALID_CREDENTIALS: 'USER_INVALID_CREDENTIALS',\n USER_NOT_FOUND: 'USER_NOT_FOUND',\n EMAIL_ALREADY_EXISTS: 'USER_EMAIL_ALREADY_EXISTS',\n NOT_AUTHENTICATED: 'USER_NOT_AUTHENTICATED',\n RESET_TOKEN_INVALID: 'USER_RESET_TOKEN_INVALID',\n RESET_TOKEN_EXPIRED: 'USER_RESET_TOKEN_EXPIRED',\n RESET_TOKEN_ALREADY_USED: 'USER_RESET_TOKEN_ALREADY_USED',\n WEAK_PASSWORD: 'USER_WEAK_PASSWORD',\n PROVIDER_MISCONFIGURED: 'USER_PROVIDER_MISCONFIGURED',\n PROVIDER_DISABLED: 'USER_PROVIDER_DISABLED',\n CONFIG_MISSING: 'USER_CONFIG_MISSING',\n} as const\n\nexport type UserErrorCode = (typeof USER_ERROR_CODE)[keyof typeof USER_ERROR_CODE]\n\nexport class UserError extends Error {\n readonly statusCode: number\n readonly code: UserErrorCode\n readonly details?: unknown\n\n constructor(params: { message: string; statusCode: number; code: UserErrorCode; details?: unknown }) {\n super(params.message)\n this.name = 'UserError'\n this.statusCode = params.statusCode\n this.code = params.code\n this.details = params.details\n }\n}\n\nexport class InvalidCredentialsError extends UserError {\n constructor() {\n super({\n message: 'Invalid credentials',\n statusCode: 401,\n code: USER_ERROR_CODE.INVALID_CREDENTIALS,\n })\n this.name = 'InvalidCredentialsError'\n }\n}\n\nexport class UserNotFoundError extends UserError {\n constructor() {\n super({\n message: 'User not found',\n statusCode: 404,\n code: USER_ERROR_CODE.USER_NOT_FOUND,\n })\n this.name = 'UserNotFoundError'\n }\n}\n\nexport class EmailAlreadyExistsError extends UserError {\n constructor() {\n super({\n message: 'Email already exists',\n statusCode: 409,\n code: USER_ERROR_CODE.EMAIL_ALREADY_EXISTS,\n })\n this.name = 'EmailAlreadyExistsError'\n }\n}\n\nexport class NotAuthenticatedError extends UserError {\n constructor() {\n super({\n message: 'Not authenticated',\n statusCode: 401,\n code: USER_ERROR_CODE.NOT_AUTHENTICATED,\n })\n this.name = 'NotAuthenticatedError'\n }\n}\n\nexport class ResetTokenInvalidError extends UserError {\n constructor() {\n super({\n message: 'Invalid reset token',\n statusCode: 400,\n code: USER_ERROR_CODE.RESET_TOKEN_INVALID,\n })\n this.name = 'ResetTokenInvalidError'\n }\n}\n\nexport class ResetTokenExpiredError extends UserError {\n constructor() {\n super({\n message: 'Reset token expired',\n statusCode: 400,\n code: USER_ERROR_CODE.RESET_TOKEN_EXPIRED,\n })\n this.name = 'ResetTokenExpiredError'\n }\n}\n\nexport class ResetTokenAlreadyUsedError extends UserError {\n constructor() {\n super({\n message: 'Reset token already used',\n statusCode: 400,\n code: USER_ERROR_CODE.RESET_TOKEN_ALREADY_USED,\n })\n this.name = 'ResetTokenAlreadyUsedError'\n }\n}\n\nexport class WeakPasswordError extends UserError {\n constructor() {\n super({\n message: 'Password does not meet security requirements',\n statusCode: 400,\n code: USER_ERROR_CODE.WEAK_PASSWORD,\n })\n this.name = 'WeakPasswordError'\n }\n}\n\nexport class ProviderMisconfiguredError extends UserError {\n constructor(details?: unknown) {\n super({\n message: 'Authentication provider is misconfigured',\n statusCode: 500,\n code: USER_ERROR_CODE.PROVIDER_MISCONFIGURED,\n details,\n })\n this.name = 'ProviderMisconfiguredError'\n }\n}\n\nexport class ProviderDisabledError extends UserError {\n constructor() {\n super({\n message: 'Authentication provider is not available',\n statusCode: 503,\n code: USER_ERROR_CODE.PROVIDER_DISABLED,\n })\n this.name = 'ProviderDisabledError'\n }\n}\n\nexport class ConfigMissingError extends UserError {\n constructor(field: string) {\n super({\n message: `Missing required configuration: ${field}`,\n statusCode: 500,\n code: USER_ERROR_CODE.CONFIG_MISSING,\n details: { field },\n })\n this.name = 'ConfigMissingError'\n }\n}\n","/**\n * Copyright (c) 2026 Ada Technology. All rights reserved.\n *\n * This source code is proprietary and confidential. Unauthorized copying,\n * modification, distribution, or use of this file, via any medium, is\n * strictly prohibited without prior written permission from Ada Technology.\n */\n\nimport type { UserProfile } from './user.types'\n\nexport const USER_EVENT = {\n USER_CREATED: 'user.user.created',\n USER_UPDATED: 'user.user.updated',\n LOGIN_SUCCEEDED: 'user.login.succeeded',\n LOGIN_FAILED: 'user.login.failed',\n PASSWORD_CHANGED: 'user.password.changed',\n PASSWORD_RESET_REQUESTED: 'user.password_reset.requested',\n PASSWORD_RESET_COMPLETED: 'user.password_reset.completed',\n PROFILE_UPDATED: 'user.profile.updated',\n} as const\n\nexport type UserEventType = (typeof USER_EVENT)[keyof typeof USER_EVENT]\n\nexport type BaseEvent = {\n readonly companyId?: string\n readonly occurredAt: Date\n}\n\nexport type UserCreatedEvent = BaseEvent & {\n readonly type: typeof USER_EVENT.USER_CREATED\n readonly userId: string\n readonly email: string\n}\n\nexport type UserUpdatedEvent = BaseEvent & {\n readonly type: typeof USER_EVENT.USER_UPDATED\n readonly userId: string\n readonly user: UserProfile\n}\n\nexport type LoginSucceededEvent = BaseEvent & {\n readonly type: typeof USER_EVENT.LOGIN_SUCCEEDED\n readonly userId: string\n readonly email: string\n readonly ipAddress: string\n}\n\nexport type LoginFailedEvent = BaseEvent & {\n readonly type: typeof USER_EVENT.LOGIN_FAILED\n readonly email: string\n readonly ipAddress: string\n readonly reason: string\n}\n\nexport type PasswordChangedEvent = BaseEvent & {\n readonly type: typeof USER_EVENT.PASSWORD_CHANGED\n readonly userId: string\n}\n\nexport type PasswordResetRequestedEvent = BaseEvent & {\n readonly type: typeof USER_EVENT.PASSWORD_RESET_REQUESTED\n readonly email: string\n readonly resetUrl: string\n}\n\nexport type PasswordResetCompletedEvent = BaseEvent & {\n readonly type: typeof USER_EVENT.PASSWORD_RESET_COMPLETED\n readonly userId: string\n readonly email: string\n}\n\nexport type ProfileUpdatedEvent = BaseEvent & {\n readonly type: typeof USER_EVENT.PROFILE_UPDATED\n readonly userId: string\n readonly user: UserProfile\n}\n\nexport type UserDomainEvent =\n | UserCreatedEvent\n | UserUpdatedEvent\n | LoginSucceededEvent\n | LoginFailedEvent\n | PasswordChangedEvent\n | PasswordResetRequestedEvent\n | PasswordResetCompletedEvent\n | ProfileUpdatedEvent\n\nexport type UserHooks = {\n readonly onUserCreated?: (event: UserCreatedEvent) => Promise<void> | void\n readonly onUserUpdated?: (event: UserUpdatedEvent) => Promise<void> | void\n readonly onLoginSucceeded?: (event: LoginSucceededEvent) => Promise<void> | void\n readonly onLoginFailed?: (event: LoginFailedEvent) => Promise<void> | void\n readonly onPasswordChanged?: (event: PasswordChangedEvent) => Promise<void> | void\n readonly onPasswordResetRequested?: (event: PasswordResetRequestedEvent) => Promise<void> | void\n readonly onPasswordResetCompleted?: (event: PasswordResetCompletedEvent) => Promise<void> | void\n readonly onProfileUpdated?: (event: ProfileUpdatedEvent) => Promise<void> | void\n}\n","/**\n * Copyright (c) 2026 Ada Technology. All rights reserved.\n *\n * This source code is proprietary and confidential. Unauthorized copying,\n * modification, distribution, or use of this file, via any medium, is\n * strictly prohibited without prior written permission from Ada Technology.\n */\n\nimport type { UserSession } from './user.types'\n\nexport const AUTH_PROVIDER_TYPE = {\n LOCAL: 'local',\n OAUTH2: 'oauth2',\n OIDC: 'oidc',\n} as const\n\nexport type AuthProviderType = (typeof AUTH_PROVIDER_TYPE)[keyof typeof AUTH_PROVIDER_TYPE]\n\nexport type AuthProviderInterface<TCredentials = unknown> = {\n readonly id: string\n readonly type: AuthProviderType\n authenticate(params: { readonly credentials: TCredentials; readonly ipAddress?: string }): Promise<UserSession>\n}\n\nexport type AttributeMappingRule<TClaims extends Record<string, unknown>> =\n | { readonly from: keyof TClaims }\n | { readonly value: string }\n\nexport type AttributeMapping<TClaims extends Record<string, unknown>> = {\n readonly email: AttributeMappingRule<TClaims>\n readonly name?: AttributeMappingRule<TClaims>\n readonly role?: AttributeMappingRule<TClaims>\n}\n\n/**\n * `issue` devolve o token cru; `rotate`/`revoke` recebem o **sha256 hex** dele — o token cru nunca\n * chega ao armazenamento, então um dump do Redis ou da tabela não vale sessão.\n *\n * `revokeAllForUser` é o que faz uma troca de senha realmente encerrar as sessões abertas. Sem ela,\n * a sessão comprometida sobrevive à redefinição feita justamente para matá-la — por isso é\n * obrigatória no contrato, e não uma capacidade opcional.\n */\nexport type RefreshTokenStorePort = {\n issue(params: { readonly userId: string; readonly expiresInSeconds: number }): Promise<string>\n rotate(params: {\n readonly tokenHash: string\n readonly newExpiresInSeconds: number\n }): Promise<{ readonly token: string; readonly userId: string } | null>\n revoke(params: { readonly tokenHash: string }): Promise<void>\n revokeAllForUser(params: { readonly userId: string }): Promise<void>\n}\n\nexport type SendEmailParams = {\n readonly to: string\n readonly subject: string\n readonly body: string\n readonly html?: string\n}\n\nexport type DeliveryAttemptResult = {\n readonly success: boolean\n readonly messageId?: string\n readonly error?: string\n}\n\nexport type EmailDriverPort = {\n readonly driver: string\n send(params: SendEmailParams): Promise<DeliveryAttemptResult>\n}\n\nexport type ClockPort = {\n now(): Date\n}\n\nexport type LogMeta = Readonly<Record<string, unknown>>\n\n/** Mesma forma do `LoggerPort` dos outros contratos do ecossistema — o host escreve um adapter só. */\nexport type LoggerPort = {\n error(message: string, meta?: LogMeta): void\n warn(message: string, meta?: LogMeta): void\n info(message: string, meta?: LogMeta): void\n debug(message: string, meta?: LogMeta): void\n}\n\nexport type TenancyConfig = { readonly mode: 'single'; readonly defaultCompanyId: string } | { readonly mode: 'multi' }\n\n/**\n * `issuer`/`audience` são opcionais, mas quando declarados valem na assinatura **e** na\n * verificação: um token emitido para outra plateia é recusado. Um host que já emite JWT por conta\n * própria (migração gradual, dois emissores sobre o mesmo segredo) precisa declarar os mesmos\n * valores aqui, ou os dois lados não reconhecem o token um do outro.\n */\nexport type AccessTokenConfig = {\n readonly secret: string\n readonly expiresInSeconds?: number\n readonly issuer?: string\n readonly audience?: string\n}\n\nexport type RefreshTokenConfig = {\n readonly expiresInSeconds?: number\n}\n\nexport type PasswordResetConfig = {\n readonly resetUrlTemplate: string // must contain {token}\n readonly tokenExpiresInSeconds?: number\n}\n\nexport type KeycloakConfig = {\n readonly realm: string\n readonly authServerUrl: string\n readonly clientId: string\n readonly clientSecret?: string\n readonly attributeMapping?: AttributeMapping<Record<string, unknown>>\n}\n\nexport type UserModuleConfig = {\n readonly tenancy: TenancyConfig\n readonly accessToken: AccessTokenConfig\n readonly refreshToken?: RefreshTokenConfig\n readonly passwordReset?: PasswordResetConfig\n readonly keycloak?: KeycloakConfig\n}\n\n/**\n * `keycloak` não entra aqui: a verificação de token é plumbing específico do módulo (ver\n * `KeycloakVerifierPort` em `user-module`), não um contrato genérico reutilizável por outro host.\n */\nexport type UserModuleProviders = {\n readonly refreshTokenStore?: RefreshTokenStorePort\n readonly email?: EmailDriverPort\n readonly clock?: ClockPort\n readonly logger?: LoggerPort\n}\n","/**\n * Copyright (c) 2026 Ada Technology. All rights reserved.\n *\n * This source code is proprietary and confidential. Unauthorized copying,\n * modification, distribution, or use of this file, via any medium, is\n * strictly prohibited without prior written permission from Ada Technology.\n */\n\nimport { z } from 'zod'\n\nconst PASSWORD_MIN_LENGTH = 8\nconst PASSWORD_MAX_LENGTH = 128\n\nexport const localCredentialsSchema = z.object({\n email: z.string().trim().toLowerCase().email().max(320),\n password: z.string().min(PASSWORD_MIN_LENGTH).max(PASSWORD_MAX_LENGTH),\n})\n\nexport type LocalCredentials = z.infer<typeof localCredentialsSchema>\n\nexport const requestPasswordResetSchema = z.object({\n email: z.string().trim().toLowerCase().email().max(320),\n})\n\nexport type RequestPasswordResetInput = z.infer<typeof requestPasswordResetSchema>\n\nexport const confirmPasswordResetSchema = z.object({\n token: z.string().min(1),\n newPassword: z.string().min(PASSWORD_MIN_LENGTH).max(PASSWORD_MAX_LENGTH),\n})\n\nexport type ConfirmPasswordResetInput = z.infer<typeof confirmPasswordResetSchema>\n\nexport const updateProfileSchema = z.object({\n name: z.string().trim().min(1).max(255).optional(),\n})\n\nexport type UpdateProfileInput = z.infer<typeof updateProfileSchema>\n\nexport const createUserSchema = z.object({\n email: z.string().trim().toLowerCase().email().max(320),\n name: z.string().trim().min(1).max(255),\n password: z.string().min(PASSWORD_MIN_LENGTH).max(PASSWORD_MAX_LENGTH),\n role: z.string().min(1).max(40),\n})\n\nexport type CreateUserInput = z.infer<typeof createUserSchema>\n\n/**\n * `accessToken`, não `code`/`state`: o módulo verifica localmente um token já emitido pelo\n * Keycloak (`@adatechnology/auth-keycloak`, verificação via JWKS) — a troca do `code` da\n * authorization code flow é responsabilidade do host/frontend, antes de chegar aqui.\n */\nexport const keycloakCallbackSchema = z.object({\n accessToken: z.string().min(1),\n})\n\nexport type KeycloakCallbackInput = z.infer<typeof keycloakCallbackSchema>\n"],"mappings":"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","names":["USER_ERROR_CODE","INVALID_CREDENTIALS","USER_NOT_FOUND","EMAIL_ALREADY_EXISTS","NOT_AUTHENTICATED","RESET_TOKEN_INVALID","RESET_TOKEN_EXPIRED","RESET_TOKEN_ALREADY_USED","WEAK_PASSWORD","PROVIDER_MISCONFIGURED","PROVIDER_DISABLED","CONFIG_MISSING","UserError","Error","statusCode","code","details","params","message","name","InvalidCredentialsError","UserNotFoundError","EmailAlreadyExistsError","NotAuthenticatedError","ResetTokenInvalidError","ResetTokenExpiredError","ResetTokenAlreadyUsedError","WeakPasswordError","ProviderMisconfiguredError","ProviderDisabledError","ConfigMissingError","field","USER_EVENT","USER_CREATED","USER_UPDATED","LOGIN_SUCCEEDED","LOGIN_FAILED","PASSWORD_CHANGED","PASSWORD_RESET_REQUESTED","PASSWORD_RESET_COMPLETED","PROFILE_UPDATED","AUTH_PROVIDER_TYPE","LOCAL","OAUTH2","OIDC","PASSWORD_MIN_LENGTH","PASSWORD_MAX_LENGTH","localCredentialsSchema","z","object","email","string","trim","toLowerCase","max","password","min","requestPasswordResetSchema","confirmPasswordResetSchema","token","newPassword","updateProfileSchema","name","optional","createUserSchema","role","keycloakCallbackSchema","accessToken"]}
|