@temboplus/afloat 0.1.76-beta.0 → 0.1.77-beta.10

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 (44) hide show
  1. package/dist/index.cjs.js +1 -1
  2. package/dist/index.cjs.js.map +1 -1
  3. package/dist/index.d.ts +1 -1
  4. package/dist/index.esm.js +1 -1
  5. package/dist/index.esm.js.map +1 -1
  6. package/dist/lib/error/error.permission.d.ts +1 -1
  7. package/dist/modules/auth/auth.contract.d.ts +6 -6
  8. package/dist/modules/auth/auth.manager.d.ts +1 -1
  9. package/dist/modules/auth/company-membership.model.d.ts +171 -0
  10. package/dist/modules/auth/index.d.ts +1 -1
  11. package/dist/modules/auth/user.model.d.ts +330 -33
  12. package/dist/modules/contact/contact-info.model.d.ts +183 -533
  13. package/dist/modules/contact/contact.api-contract.d.ts +16 -16
  14. package/dist/modules/contact/contact.dtos.d.ts +4 -4
  15. package/dist/modules/contact/contact.model.d.ts +309 -32
  16. package/dist/modules/login/index.d.ts +2 -0
  17. package/dist/modules/login/login.api-contract.d.ts +34 -5
  18. package/dist/modules/login/login.dtos.d.ts +85 -0
  19. package/dist/modules/login/login.model.d.ts +168 -1
  20. package/dist/modules/{auth → login}/permission.type.d.ts +8 -8
  21. package/dist/modules/payout/payout.api-contract.d.ts +46 -46
  22. package/dist/modules/payout/payout.dtos.d.ts +30 -24
  23. package/dist/modules/payout/payout.model.d.ts +242 -2
  24. package/dist/modules/payout/payout.query.d.ts +7 -0
  25. package/dist/modules/profile/profile.model.d.ts +65 -30
  26. package/dist/modules/team-member/index.d.ts +4 -0
  27. package/dist/modules/team-member/role.model.d.ts +61 -0
  28. package/dist/modules/{user/user.contract.d.ts → team-member/team-member.contract.d.ts} +238 -127
  29. package/dist/modules/team-member/team-member.dtos.d.ts +261 -0
  30. package/dist/modules/team-member/team-member.model.d.ts +237 -0
  31. package/dist/modules/team-member/team-member.repository.d.ts +179 -0
  32. package/dist/modules/wallet/narration.model.d.ts +34 -38
  33. package/dist/modules/wallet/statement-entry.model.d.ts +172 -73
  34. package/dist/modules/wallet/wallet.contract.d.ts +4 -4
  35. package/dist/modules/wallet/wallet.dtos.d.ts +8 -8
  36. package/dist/modules/wallet/wallet.model.d.ts +56 -19
  37. package/dist/modules/wallet/wallet.query.d.ts +95 -0
  38. package/dist/modules/wallet/wallet.repository.d.ts +45 -13
  39. package/package.json +2 -2
  40. package/dist/modules/user/index.d.ts +0 -4
  41. package/dist/modules/user/role.model.d.ts +0 -13
  42. package/dist/modules/user/user.dtos.d.ts +0 -145
  43. package/dist/modules/user/user.model.d.ts +0 -108
  44. package/dist/modules/user/user.repository.d.ts +0 -179
@@ -1,4 +1,4 @@
1
- import { Permission } from "@/modules/auth/permission.type.js";
1
+ import { Permission } from "@/modules/login/permission.type.js";
2
2
  /**
3
3
  * Custom error class representing an error caused by missing required permissions.
4
4
  * Extends the built-in {@link Error} class to include the `requiredPermissions` property.
@@ -54,6 +54,8 @@ export declare const authContract: {
54
54
  resetPassword: z.ZodBoolean;
55
55
  }, "strip", z.ZodTypeAny, {
56
56
  resetPassword: boolean;
57
+ access: string[];
58
+ token: string;
57
59
  profile: {
58
60
  id: string;
59
61
  displayName: string;
@@ -64,10 +66,10 @@ export declare const authContract: {
64
66
  email?: string | null | undefined;
65
67
  autoApprove?: boolean | null | undefined;
66
68
  };
67
- token: string;
68
- access: string[];
69
69
  }, {
70
70
  resetPassword: boolean;
71
+ access: string[];
72
+ token: string;
71
73
  profile: {
72
74
  id: string;
73
75
  displayName: string;
@@ -78,8 +80,6 @@ export declare const authContract: {
78
80
  email?: string | null | undefined;
79
81
  autoApprove?: boolean | null | undefined;
80
82
  };
81
- token: string;
82
- access: string[];
83
83
  }>;
84
84
  400: z.ZodObject<{}, "strip", z.ZodTypeAny, {}, {}>;
85
85
  };
@@ -97,11 +97,11 @@ export declare const authContract: {
97
97
  currentPassword: z.ZodString;
98
98
  newPassword: z.ZodString;
99
99
  }, "strip", z.ZodTypeAny, {
100
- currentPassword: string;
101
100
  newPassword: string;
102
- }, {
103
101
  currentPassword: string;
102
+ }, {
104
103
  newPassword: string;
104
+ currentPassword: string;
105
105
  }>;
106
106
  path: "/password";
107
107
  responses: {};
@@ -1,4 +1,4 @@
1
- import { Permission } from "@/modules/auth/permission.type.js";
1
+ import { Permission } from "@/modules/login/permission.type.js";
2
2
  import { User } from "@/modules/auth/user.model.js";
3
3
  /**
4
4
  * Clean authentication manager for client-side usage only.
@@ -0,0 +1,171 @@
1
+ import z from "zod";
2
+ import { Profile } from "../profile/profile.model.js";
3
+ import { Role } from "../team-member/role.model.js";
4
+ /**
5
+ * Zod schema for CompanyMembership JSON serialization
6
+ */
7
+ export declare const CompanyMembershipJSONSchema: z.ZodObject<{
8
+ companyProfile: z.ZodObject<{
9
+ id: z.ZodString;
10
+ firstName: z.ZodOptional<z.ZodNullable<z.ZodString>>;
11
+ lastName: z.ZodOptional<z.ZodNullable<z.ZodString>>;
12
+ displayName: z.ZodString;
13
+ phone: z.ZodOptional<z.ZodNullable<z.ZodString>>;
14
+ accountNo: z.ZodString;
15
+ email: z.ZodOptional<z.ZodNullable<z.ZodString>>;
16
+ autoApprove: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
17
+ version: z.ZodDefault<z.ZodOptional<z.ZodString>>;
18
+ }, "strip", z.ZodTypeAny, {
19
+ id: string;
20
+ displayName: string;
21
+ accountNo: string;
22
+ version: string;
23
+ firstName?: string | null | undefined;
24
+ lastName?: string | null | undefined;
25
+ phone?: string | null | undefined;
26
+ email?: string | null | undefined;
27
+ autoApprove?: boolean | null | undefined;
28
+ }, {
29
+ id: string;
30
+ displayName: string;
31
+ accountNo: string;
32
+ firstName?: string | null | undefined;
33
+ lastName?: string | null | undefined;
34
+ phone?: string | null | undefined;
35
+ email?: string | null | undefined;
36
+ autoApprove?: boolean | null | undefined;
37
+ version?: string | undefined;
38
+ }>;
39
+ role: z.ZodOptional<z.ZodObject<{
40
+ id: z.ZodString;
41
+ name: z.ZodString;
42
+ description: z.ZodOptional<z.ZodString>;
43
+ access: z.ZodArray<z.ZodString, "many">;
44
+ createdAt: z.ZodString;
45
+ updatedAt: z.ZodString;
46
+ version: z.ZodDefault<z.ZodOptional<z.ZodString>>;
47
+ }, "strip", z.ZodTypeAny, {
48
+ name: string;
49
+ id: string;
50
+ version: string;
51
+ createdAt: string;
52
+ updatedAt: string;
53
+ access: string[];
54
+ description?: string | undefined;
55
+ }, {
56
+ name: string;
57
+ id: string;
58
+ createdAt: string;
59
+ updatedAt: string;
60
+ access: string[];
61
+ version?: string | undefined;
62
+ description?: string | undefined;
63
+ }>>;
64
+ version: z.ZodDefault<z.ZodOptional<z.ZodString>>;
65
+ }, "strip", z.ZodTypeAny, {
66
+ version: string;
67
+ companyProfile: {
68
+ id: string;
69
+ displayName: string;
70
+ accountNo: string;
71
+ version: string;
72
+ firstName?: string | null | undefined;
73
+ lastName?: string | null | undefined;
74
+ phone?: string | null | undefined;
75
+ email?: string | null | undefined;
76
+ autoApprove?: boolean | null | undefined;
77
+ };
78
+ role?: {
79
+ name: string;
80
+ id: string;
81
+ version: string;
82
+ createdAt: string;
83
+ updatedAt: string;
84
+ access: string[];
85
+ description?: string | undefined;
86
+ } | undefined;
87
+ }, {
88
+ companyProfile: {
89
+ id: string;
90
+ displayName: string;
91
+ accountNo: string;
92
+ firstName?: string | null | undefined;
93
+ lastName?: string | null | undefined;
94
+ phone?: string | null | undefined;
95
+ email?: string | null | undefined;
96
+ autoApprove?: boolean | null | undefined;
97
+ version?: string | undefined;
98
+ };
99
+ version?: string | undefined;
100
+ role?: {
101
+ name: string;
102
+ id: string;
103
+ createdAt: string;
104
+ updatedAt: string;
105
+ access: string[];
106
+ version?: string | undefined;
107
+ description?: string | undefined;
108
+ } | undefined;
109
+ }>;
110
+ export type CompanyMembershipJSON = z.infer<typeof CompanyMembershipJSONSchema>;
111
+ export type CompanyMembershipData = {
112
+ companyProfile: Profile;
113
+ role?: Role;
114
+ };
115
+ /**
116
+ * Represents a user's membership within a company.
117
+ *
118
+ * This class encapsulates the relationship between a user and their company:
119
+ * - The company profile the user belongs to
120
+ * - The user's role within that company (optional - depends on permissions)
121
+ *
122
+ * Note: Permissions are stored in LogIn.access, not here.
123
+ * This model focuses purely on the company-user relationship.
124
+ *
125
+ * The role may be undefined if the user doesn't have permission to view
126
+ * role details (Permissions.Role.ViewRole).
127
+ */
128
+ export declare class CompanyMembership {
129
+ private readonly _companyProfile;
130
+ private readonly _role?;
131
+ private constructor();
132
+ /**
133
+ * Creates a CompanyMembership instance from the required data.
134
+ *
135
+ * @param data - The membership data
136
+ * @returns A new CompanyMembership instance, or undefined if invalid
137
+ *
138
+ * @example
139
+ * ```typescript
140
+ * const membership = CompanyMembership.from({
141
+ * companyProfile: profile,
142
+ * role: role // optional
143
+ * });
144
+ * ```
145
+ */
146
+ static from(data: CompanyMembershipData): CompanyMembership | undefined;
147
+ /**
148
+ * Gets the company profile.
149
+ */
150
+ get companyProfile(): Profile;
151
+ /**
152
+ * Gets the user's role (may be undefined if user lacks permission to view it).
153
+ */
154
+ get role(): Role | undefined;
155
+ /**
156
+ * Serializes the CompanyMembership instance to a JSON-compatible object
157
+ */
158
+ toJSON(): CompanyMembershipJSON;
159
+ /**
160
+ * Serializes the CompanyMembership instance to a JSON string
161
+ */
162
+ toJSONString(): string;
163
+ /**
164
+ * Creates a CompanyMembership instance from a JSON-compatible object or string
165
+ */
166
+ static fromJSON(json: CompanyMembershipJSON | string): CompanyMembership | undefined;
167
+ /**
168
+ * Type guard using Zod schema validation
169
+ */
170
+ static isCompanyMembershipJSON(obj: unknown): obj is CompanyMembershipJSON;
171
+ }
@@ -1,4 +1,4 @@
1
1
  export * from "./auth.manager.js";
2
2
  export * from "./auth.repository.js";
3
- export * from "./permission.type.js";
4
3
  export * from "./user.model.js";
4
+ export * from "./company-membership.model.js";
@@ -1,66 +1,363 @@
1
- import { Permission } from "./permission.type.js";
1
+ import { Permission } from "../login/permission.type.js";
2
2
  import { Profile } from "../profile/profile.model.js";
3
+ import { LogIn } from "../login/login.model.js";
4
+ import { CompanyMembership } from "./company-membership.model.js";
5
+ import { Role } from "../team-member/role.model.js";
6
+ import z from "zod";
3
7
  /**
4
- * Represents a user in Afloat.
8
+ * Zod schema for User JSON serialization
9
+ * Composes the schemas from nested objects
10
+ */
11
+ export declare const UserJSONSchema: z.ZodObject<{
12
+ logIn: z.ZodObject<{
13
+ id: z.ZodString;
14
+ profileId: z.ZodString;
15
+ name: z.ZodString;
16
+ identity: z.ZodString;
17
+ type: z.ZodString;
18
+ roleId: z.ZodString;
19
+ isActive: z.ZodBoolean;
20
+ isArchived: z.ZodBoolean;
21
+ resetPassword: z.ZodBoolean;
22
+ createdAt: z.ZodString;
23
+ updatedAt: z.ZodString;
24
+ access: z.ZodArray<z.ZodString, "many">;
25
+ version: z.ZodDefault<z.ZodOptional<z.ZodString>>;
26
+ }, "strip", z.ZodTypeAny, {
27
+ type: string;
28
+ name: string;
29
+ id: string;
30
+ version: string;
31
+ profileId: string;
32
+ identity: string;
33
+ roleId: string;
34
+ isActive: boolean;
35
+ isArchived: boolean;
36
+ resetPassword: boolean;
37
+ createdAt: string;
38
+ updatedAt: string;
39
+ access: string[];
40
+ }, {
41
+ type: string;
42
+ name: string;
43
+ id: string;
44
+ profileId: string;
45
+ identity: string;
46
+ roleId: string;
47
+ isActive: boolean;
48
+ isArchived: boolean;
49
+ resetPassword: boolean;
50
+ createdAt: string;
51
+ updatedAt: string;
52
+ access: string[];
53
+ version?: string | undefined;
54
+ }>;
55
+ companyProfile: z.ZodObject<{
56
+ id: z.ZodString;
57
+ firstName: z.ZodOptional<z.ZodNullable<z.ZodString>>;
58
+ lastName: z.ZodOptional<z.ZodNullable<z.ZodString>>;
59
+ displayName: z.ZodString;
60
+ phone: z.ZodOptional<z.ZodNullable<z.ZodString>>;
61
+ accountNo: z.ZodString;
62
+ email: z.ZodOptional<z.ZodNullable<z.ZodString>>;
63
+ autoApprove: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
64
+ version: z.ZodDefault<z.ZodOptional<z.ZodString>>;
65
+ }, "strip", z.ZodTypeAny, {
66
+ id: string;
67
+ displayName: string;
68
+ accountNo: string;
69
+ version: string;
70
+ firstName?: string | null | undefined;
71
+ lastName?: string | null | undefined;
72
+ phone?: string | null | undefined;
73
+ email?: string | null | undefined;
74
+ autoApprove?: boolean | null | undefined;
75
+ }, {
76
+ id: string;
77
+ displayName: string;
78
+ accountNo: string;
79
+ firstName?: string | null | undefined;
80
+ lastName?: string | null | undefined;
81
+ phone?: string | null | undefined;
82
+ email?: string | null | undefined;
83
+ autoApprove?: boolean | null | undefined;
84
+ version?: string | undefined;
85
+ }>;
86
+ role: z.ZodOptional<z.ZodObject<{
87
+ id: z.ZodString;
88
+ name: z.ZodString;
89
+ description: z.ZodOptional<z.ZodString>;
90
+ access: z.ZodArray<z.ZodString, "many">;
91
+ createdAt: z.ZodString;
92
+ updatedAt: z.ZodString;
93
+ version: z.ZodDefault<z.ZodOptional<z.ZodString>>;
94
+ }, "strip", z.ZodTypeAny, {
95
+ name: string;
96
+ id: string;
97
+ version: string;
98
+ createdAt: string;
99
+ updatedAt: string;
100
+ access: string[];
101
+ description?: string | undefined;
102
+ }, {
103
+ name: string;
104
+ id: string;
105
+ createdAt: string;
106
+ updatedAt: string;
107
+ access: string[];
108
+ version?: string | undefined;
109
+ description?: string | undefined;
110
+ }>>;
111
+ token: z.ZodString;
112
+ version: z.ZodDefault<z.ZodOptional<z.ZodString>>;
113
+ }, "strip", z.ZodTypeAny, {
114
+ version: string;
115
+ companyProfile: {
116
+ id: string;
117
+ displayName: string;
118
+ accountNo: string;
119
+ version: string;
120
+ firstName?: string | null | undefined;
121
+ lastName?: string | null | undefined;
122
+ phone?: string | null | undefined;
123
+ email?: string | null | undefined;
124
+ autoApprove?: boolean | null | undefined;
125
+ };
126
+ logIn: {
127
+ type: string;
128
+ name: string;
129
+ id: string;
130
+ version: string;
131
+ profileId: string;
132
+ identity: string;
133
+ roleId: string;
134
+ isActive: boolean;
135
+ isArchived: boolean;
136
+ resetPassword: boolean;
137
+ createdAt: string;
138
+ updatedAt: string;
139
+ access: string[];
140
+ };
141
+ token: string;
142
+ role?: {
143
+ name: string;
144
+ id: string;
145
+ version: string;
146
+ createdAt: string;
147
+ updatedAt: string;
148
+ access: string[];
149
+ description?: string | undefined;
150
+ } | undefined;
151
+ }, {
152
+ companyProfile: {
153
+ id: string;
154
+ displayName: string;
155
+ accountNo: string;
156
+ firstName?: string | null | undefined;
157
+ lastName?: string | null | undefined;
158
+ phone?: string | null | undefined;
159
+ email?: string | null | undefined;
160
+ autoApprove?: boolean | null | undefined;
161
+ version?: string | undefined;
162
+ };
163
+ logIn: {
164
+ type: string;
165
+ name: string;
166
+ id: string;
167
+ profileId: string;
168
+ identity: string;
169
+ roleId: string;
170
+ isActive: boolean;
171
+ isArchived: boolean;
172
+ resetPassword: boolean;
173
+ createdAt: string;
174
+ updatedAt: string;
175
+ access: string[];
176
+ version?: string | undefined;
177
+ };
178
+ token: string;
179
+ version?: string | undefined;
180
+ role?: {
181
+ name: string;
182
+ id: string;
183
+ createdAt: string;
184
+ updatedAt: string;
185
+ access: string[];
186
+ version?: string | undefined;
187
+ description?: string | undefined;
188
+ } | undefined;
189
+ }>;
190
+ /**
191
+ * Infer the UserJSON type from the schema
192
+ */
193
+ export type UserJSON = z.infer<typeof UserJSONSchema>;
194
+ export type UserData = {
195
+ logIn: LogIn;
196
+ companyProfile: Profile;
197
+ role?: Role;
198
+ token: string;
199
+ };
200
+ /**
201
+ * Represents the currently authenticated user session.
202
+ *
203
+ * This class combines:
204
+ * - LogIn: User account data (identity, permissions, resetPassword, etc.)
205
+ * - CompanyMembership: User's relationship to their company (company profile + role)
206
+ * - Token: Session authentication token
207
+ *
208
+ * The User represents "who is logged in right now" with their full context.
5
209
  *
6
- * This class centralizes user-related logic, simplifying interaction
7
- * with user-related data and ensuring consistent access checks across the application.
210
+ * Note: The role in CompanyMembership may be undefined if the user doesn't have
211
+ * permission to view role details (Permissions.Role.ViewRole).
8
212
  */
9
213
  export declare class User {
214
+ private readonly _logIn;
215
+ private readonly _membership;
216
+ private readonly _token;
217
+ private readonly _permissionMap;
218
+ private constructor();
10
219
  /**
11
- * Logged-in user name.
220
+ * Creates a User instance from the provided data.
221
+ *
222
+ * @param data - User session data
223
+ * @returns A new User instance, or undefined if data is invalid
224
+ *
225
+ * @example
226
+ * ```typescript
227
+ * const user = User.from({
228
+ * logIn: logIn,
229
+ * companyProfile: profile,
230
+ * role: role, // optional
231
+ * token: "auth-token"
232
+ * });
233
+ * ```
12
234
  */
13
- name: string;
235
+ static from(data: UserData): User | undefined;
14
236
  /**
15
- * Logged-in identity: phone number or email address.
237
+ * Gets the user's login data.
16
238
  */
17
- identity: string;
239
+ get logIn(): LogIn;
18
240
  /**
19
- * The user's Afloat profile.
241
+ * Gets the user's company membership (includes company profile and role).
20
242
  */
21
- profile: Profile;
243
+ get membership(): CompanyMembership;
22
244
  /**
23
- * The user's authentication token.
245
+ * Gets the user's authentication token.
24
246
  */
25
- token: string;
247
+ get token(): string;
26
248
  /**
27
- * Indicates whether the user must change their default password.
249
+ * Convenience getter for the user's ID.
28
250
  */
29
- resetPassword: boolean;
251
+ get id(): string;
30
252
  /**
31
- * A list of granted access keys (permissions).
253
+ * Convenience getter for the user's name.
32
254
  */
33
- access: Permission[];
255
+ get name(): string;
34
256
  /**
35
- * A map of access keys to boolean values for fast permission checks.
257
+ * Convenience getter for the user's identity (email).
36
258
  */
37
- private accessMap;
259
+ get identity(): string;
38
260
  /**
39
- * Creates a new `User` instance.
261
+ * Convenience getter for the user's role ID.
40
262
  */
41
- private constructor();
263
+ get roleId(): string;
264
+ /**
265
+ * Convenience getter for whether the user must reset their password.
266
+ */
267
+ get resetPassword(): boolean;
268
+ /**
269
+ * Convenience getter for the company profile.
270
+ */
271
+ get profile(): Profile;
42
272
  /**
43
- * Checks if the user has a specific access permission.
273
+ * Convenience getter for the user's role (may be undefined).
274
+ */
275
+ get role(): Role | undefined;
276
+ /**
277
+ * Convenience getter for permissions array.
278
+ */
279
+ get access(): ReadonlyArray<string>;
280
+ /**
281
+ * Checks if the user has a specific permission.
282
+ *
283
+ * @param permission - The permission to check
284
+ * @returns true if the user has the permission
285
+ */
286
+ can(permission: Permission): boolean;
287
+ /**
288
+ * Checks if the user has any of the specified permissions.
289
+ *
290
+ * @param permissions - Array of permissions to check
291
+ * @returns true if the user has at least one permission
292
+ */
293
+ canAny(permissions: Permission[]): boolean;
294
+ /**
295
+ * Checks if the user has all of the specified permissions.
44
296
  *
45
- * @param key - The access key to check.
46
- * @returns `true` if the user has the specified access, otherwise `false`.
297
+ * @param permissions - Array of permissions to check
298
+ * @returns true if the user has all permissions
299
+ */
300
+ canAll(permissions: Permission[]): boolean;
301
+ /**
302
+ * Checks if the user can manage team members.
47
303
  */
48
- can(key: Permission): boolean;
304
+ canManageTeam(): boolean;
49
305
  /**
50
- * Returns a plain object representation of the user.
51
- * This can safely be embedded in a JWT payload.
306
+ * Checks if the user can view role details.
52
307
  */
53
- toObject(): Record<string, any>;
308
+ canViewRoles(): boolean;
54
309
  /**
55
- * Serializes the `User` instance to a JSON string.
310
+ * Serializes the User instance to a JSON-compatible object
311
+ *
312
+ * This method creates a complete snapshot of the user session including
313
+ * all nested objects (LogIn, Profile, Role). All data can be reconstructed
314
+ * from this JSON representation without needing backend calls.
315
+ *
316
+ * @returns {UserJSON} A plain object containing all necessary User data
317
+ *
318
+ * @example
319
+ * ```typescript
320
+ * const user = User.from({ ... });
321
+ * const json = user.toJSON();
322
+ * // Store in localStorage
323
+ * localStorage.setItem('currentUser', JSON.stringify(json));
324
+ * ```
325
+ */
326
+ toJSON(): UserJSON;
327
+ /**
328
+ * Serializes the User instance to a JSON string
329
+ *
330
+ * @returns {string} JSON string representation of the User
56
331
  */
57
- toJSON(): string;
332
+ toJSONString(): string;
58
333
  /**
59
- * Creates a new `User` instance from a JSON string.
334
+ * Creates a User instance from a JSON-compatible object or string
335
+ *
336
+ * This static method reconstructs a complete User instance from data that was
337
+ * previously serialized using toJSON(). It validates the input data and
338
+ * ensures all nested objects (LogIn, Profile, Role) are properly reconstructed.
339
+ *
340
+ * @param {UserJSON | string} json - Either a UserJSON object or a JSON string
341
+ * @returns {User | undefined} A User instance if valid, undefined otherwise
342
+ *
343
+ * @example
344
+ * ```typescript
345
+ * // From localStorage
346
+ * const stored = localStorage.getItem('currentUser');
347
+ * const user = User.fromJSON(stored!);
348
+ *
349
+ * // From object
350
+ * const userJson = {
351
+ * logIn: { id: "...", ... },
352
+ * companyProfile: { id: "...", ... },
353
+ * token: "..."
354
+ * };
355
+ * const user = User.fromJSON(userJson);
356
+ * ```
60
357
  */
61
- static fromJSON(jsonString: string): User | undefined;
358
+ static fromJSON(json: UserJSON | string): User | undefined;
62
359
  /**
63
- * Creates a new `User` instance from a plain object.
360
+ * Type guard using Zod schema validation
64
361
  */
65
- static from(data: any): User | undefined;
362
+ static isUserJSON(obj: unknown): obj is UserJSON;
66
363
  }