@umituz/web-firebase 1.0.4 → 2.0.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.
Files changed (75) hide show
  1. package/README.md +555 -0
  2. package/dist/application/index.d.mts +273 -0
  3. package/dist/application/index.d.ts +273 -0
  4. package/dist/application/index.js +490 -0
  5. package/dist/application/index.mjs +19 -0
  6. package/dist/chunk-34DL2QWQ.mjs +87 -0
  7. package/dist/chunk-4FP2ELQ5.mjs +96 -0
  8. package/dist/chunk-7TX3OU3O.mjs +721 -0
  9. package/dist/chunk-I6WGBPFB.mjs +439 -0
  10. package/dist/chunk-RZ4QR6TB.mjs +96 -0
  11. package/dist/chunk-U2XI4MGO.mjs +397 -0
  12. package/dist/domain/index.d.mts +325 -0
  13. package/dist/domain/index.d.ts +325 -0
  14. package/dist/domain/index.js +662 -0
  15. package/dist/domain/index.mjs +36 -0
  16. package/dist/file.repository.interface-v5vHgVsZ.d.mts +241 -0
  17. package/dist/file.repository.interface-v5vHgVsZ.d.ts +241 -0
  18. package/dist/firebase.entity-xvfEPjXZ.d.mts +15 -0
  19. package/dist/firebase.entity-xvfEPjXZ.d.ts +15 -0
  20. package/dist/index.d.mts +14 -96
  21. package/dist/index.d.ts +14 -96
  22. package/dist/index.js +1717 -78
  23. package/dist/index.mjs +88 -175
  24. package/dist/infrastructure/index.d.mts +170 -0
  25. package/dist/infrastructure/index.d.ts +170 -0
  26. package/dist/infrastructure/index.js +856 -0
  27. package/dist/infrastructure/index.mjs +46 -0
  28. package/dist/presentation/index.d.mts +25 -0
  29. package/dist/presentation/index.d.ts +25 -0
  30. package/dist/presentation/index.js +105 -0
  31. package/dist/presentation/index.mjs +6 -0
  32. package/dist/user.repository.interface-DS74TsJ5.d.mts +298 -0
  33. package/dist/user.repository.interface-DS74TsJ5.d.ts +298 -0
  34. package/package.json +39 -12
  35. package/src/application/dto/auth.dto.ts +69 -0
  36. package/src/application/dto/index.ts +7 -0
  37. package/src/application/dto/user.dto.ts +64 -0
  38. package/src/application/index.ts +7 -0
  39. package/src/application/use-cases/auth/reset-password.use-case.ts +66 -0
  40. package/src/application/use-cases/auth/sign-in-with-google.use-case.ts +86 -0
  41. package/src/application/use-cases/auth/sign-in.use-case.ts +77 -0
  42. package/src/application/use-cases/auth/sign-out.use-case.ts +22 -0
  43. package/src/application/use-cases/auth/sign-up.use-case.ts +99 -0
  44. package/src/application/use-cases/index.ts +12 -0
  45. package/src/application/use-cases/user/delete-account.use-case.ts +77 -0
  46. package/src/application/use-cases/user/update-profile.use-case.ts +98 -0
  47. package/src/domain/entities/file.entity.ts +151 -0
  48. package/src/domain/entities/firebase.entity.ts +13 -0
  49. package/src/domain/entities/timestamp.entity.ts +116 -0
  50. package/src/domain/entities/user.entity.ts +193 -0
  51. package/src/domain/errors/auth.errors.ts +115 -0
  52. package/src/domain/errors/repository.errors.ts +121 -0
  53. package/src/domain/index.ts +30 -0
  54. package/src/domain/interfaces/auth.repository.interface.ts +83 -0
  55. package/src/domain/interfaces/file.repository.interface.ts +143 -0
  56. package/src/domain/interfaces/repository.interface.ts +11 -0
  57. package/src/domain/interfaces/user.repository.interface.ts +75 -0
  58. package/src/domain/value-objects/email.vo.ts +105 -0
  59. package/src/domain/value-objects/file-path.vo.ts +184 -0
  60. package/src/domain/value-objects/user-id.vo.ts +87 -0
  61. package/src/index.ts +23 -0
  62. package/src/infrastructure/firebase/auth.adapter.ts +220 -0
  63. package/src/infrastructure/firebase/client.ts +141 -0
  64. package/src/infrastructure/firebase/firestore.adapter.ts +190 -0
  65. package/src/infrastructure/firebase/storage.adapter.ts +323 -0
  66. package/src/infrastructure/index.ts +13 -0
  67. package/src/infrastructure/services/firebase.service.ts +30 -0
  68. package/src/infrastructure/services/firestore.repository.ts +66 -0
  69. package/src/infrastructure/utils/storage.util.ts +46 -0
  70. package/src/presentation/hooks/useAuth.ts +153 -0
  71. package/src/presentation/hooks/useFirebaseAuth.ts +122 -0
  72. package/src/presentation/hooks/useFirestore.ts +125 -0
  73. package/src/presentation/hooks/useStorage.ts +141 -0
  74. package/src/presentation/index.ts +6 -0
  75. package/src/presentation/providers/FirebaseProvider.tsx +40 -0
@@ -0,0 +1,662 @@
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 __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/domain/index.ts
21
+ var domain_exports = {};
22
+ __export(domain_exports, {
23
+ AuthError: () => AuthError,
24
+ AuthErrorCode: () => AuthErrorCode,
25
+ Email: () => Email,
26
+ FileErrorCode: () => FileErrorCode,
27
+ FilePath: () => FilePath,
28
+ RepositoryError: () => RepositoryError,
29
+ RepositoryErrorCode: () => RepositoryErrorCode,
30
+ Timestamp: () => Timestamp,
31
+ USER_COLLECTIONS: () => USER_COLLECTIONS,
32
+ USER_SUBCOLLECTIONS: () => USER_SUBCOLLECTIONS,
33
+ UserId: () => UserId,
34
+ createAuthError: () => createAuthError,
35
+ createRepositoryError: () => createRepositoryError,
36
+ serverTimestamp: () => serverTimestamp
37
+ });
38
+ module.exports = __toCommonJS(domain_exports);
39
+
40
+ // src/domain/entities/user.entity.ts
41
+ var USER_COLLECTIONS = {
42
+ USERS: "users",
43
+ CONTENT: "content",
44
+ ANALYTICS: "analytics",
45
+ CONNECTED_ACCOUNTS: "connectedAccounts"
46
+ };
47
+ var USER_SUBCOLLECTIONS = {
48
+ CONTENT: "content",
49
+ ANALYTICS: "analytics",
50
+ SCHEDULED: "scheduled",
51
+ PUBLISHED: "published",
52
+ DRAFTS: "drafts"
53
+ };
54
+
55
+ // src/domain/entities/file.entity.ts
56
+ var FileErrorCode = /* @__PURE__ */ ((FileErrorCode2) => {
57
+ FileErrorCode2["FILE_TOO_LARGE"] = "FILE_TOO_LARGE";
58
+ FileErrorCode2["INVALID_TYPE"] = "INVALID_TYPE";
59
+ FileErrorCode2["INVALID_EXTENSION"] = "INVALID_EXTENSION";
60
+ FileErrorCode2["UPLOAD_FAILED"] = "UPLOAD_FAILED";
61
+ FileErrorCode2["DOWNLOAD_FAILED"] = "DOWNLOAD_FAILED";
62
+ FileErrorCode2["DELETE_FAILED"] = "DELETE_FAILED";
63
+ FileErrorCode2["FILE_NOT_FOUND"] = "FILE_NOT_FOUND";
64
+ FileErrorCode2["NETWORK_ERROR"] = "NETWORK_ERROR";
65
+ FileErrorCode2["CANCELLED"] = "CANCELLED";
66
+ return FileErrorCode2;
67
+ })(FileErrorCode || {});
68
+
69
+ // src/domain/entities/timestamp.entity.ts
70
+ var Timestamp = class _Timestamp {
71
+ constructor(seconds, nanoseconds) {
72
+ this.seconds = seconds;
73
+ this.nanoseconds = nanoseconds;
74
+ }
75
+ /**
76
+ * Create Timestamp from JavaScript Date
77
+ */
78
+ static fromDate(date) {
79
+ const milliseconds = date.getTime();
80
+ const seconds = Math.floor(milliseconds / 1e3);
81
+ const nanoseconds = milliseconds % 1e3 * 1e6;
82
+ return new _Timestamp(seconds, nanoseconds);
83
+ }
84
+ /**
85
+ * Create Timestamp from milliseconds
86
+ */
87
+ static fromMillis(milliseconds) {
88
+ const seconds = Math.floor(milliseconds / 1e3);
89
+ const nanoseconds = milliseconds % 1e3 * 1e6;
90
+ return new _Timestamp(seconds, nanoseconds);
91
+ }
92
+ /**
93
+ * Create Timestamp from Firestore Timestamp
94
+ */
95
+ static fromFirestoreTimestamp(timestamp) {
96
+ return new _Timestamp(timestamp.seconds, timestamp.nanoseconds);
97
+ }
98
+ /**
99
+ * Get current timestamp
100
+ */
101
+ static now() {
102
+ return _Timestamp.fromDate(/* @__PURE__ */ new Date());
103
+ }
104
+ /**
105
+ * Convert to JavaScript Date
106
+ */
107
+ toDate() {
108
+ return new Date(this.seconds * 1e3 + this.nanoseconds / 1e6);
109
+ }
110
+ /**
111
+ * Convert to milliseconds
112
+ */
113
+ toMillis() {
114
+ return this.seconds * 1e3 + this.nanoseconds / 1e6;
115
+ }
116
+ /**
117
+ * Convert to Firestore Timestamp
118
+ */
119
+ toFirestoreTimestamp() {
120
+ return {
121
+ seconds: this.seconds,
122
+ nanoseconds: this.nanoseconds
123
+ };
124
+ }
125
+ /**
126
+ * Convert to ISO string
127
+ */
128
+ toISOString() {
129
+ return this.toDate().toISOString();
130
+ }
131
+ /**
132
+ * Check if timestamp is in the past
133
+ */
134
+ isPast() {
135
+ return this.toMillis() < Date.now();
136
+ }
137
+ /**
138
+ * Check if timestamp is in the future
139
+ */
140
+ isFuture() {
141
+ return this.toMillis() > Date.now();
142
+ }
143
+ /**
144
+ * Get difference in milliseconds with another timestamp
145
+ */
146
+ diff(other) {
147
+ return this.toMillis() - other.toMillis();
148
+ }
149
+ };
150
+ var serverTimestamp = {
151
+ __type__: "serverTimestamp"
152
+ };
153
+
154
+ // src/domain/value-objects/email.vo.ts
155
+ var Email = class _Email {
156
+ value;
157
+ validated;
158
+ constructor(email) {
159
+ this.value = email.trim().toLowerCase();
160
+ this.validated = this.isValid();
161
+ if (!this.validated) {
162
+ throw new Error(`Invalid email address: ${email}`);
163
+ }
164
+ }
165
+ /**
166
+ * Validate email format
167
+ */
168
+ isValid() {
169
+ const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
170
+ return emailRegex.test(this.value);
171
+ }
172
+ /**
173
+ * Get email value
174
+ */
175
+ getValue() {
176
+ return this.value;
177
+ }
178
+ /**
179
+ * Get local part (before @)
180
+ */
181
+ getLocalPart() {
182
+ return this.value.split("@")[0];
183
+ }
184
+ /**
185
+ * Get domain part (after @)
186
+ */
187
+ getDomain() {
188
+ return this.value.split("@")[1] || "";
189
+ }
190
+ /**
191
+ * Check if email is from a specific domain
192
+ */
193
+ isFromDomain(domain) {
194
+ return this.getDomain() === domain.toLowerCase();
195
+ }
196
+ /**
197
+ * Check if email is from a corporate domain (not gmail, yahoo, etc.)
198
+ */
199
+ isCorporate() {
200
+ const freeDomains = [
201
+ "gmail.com",
202
+ "yahoo.com",
203
+ "hotmail.com",
204
+ "outlook.com",
205
+ "aol.com",
206
+ "icloud.com",
207
+ "protonmail.com"
208
+ ];
209
+ return !freeDomains.includes(this.getDomain());
210
+ }
211
+ /**
212
+ * Mask email for display (e.g., u***@gmail.com)
213
+ */
214
+ mask() {
215
+ const [local, domain] = this.value.split("@");
216
+ if (local.length <= 2) {
217
+ return `${local[0]}***@${domain}`;
218
+ }
219
+ return `${local[0]}${"*".repeat(local.length - 2)}${local[local.length - 1]}@${domain}`;
220
+ }
221
+ /**
222
+ * Convert to string
223
+ */
224
+ toString() {
225
+ return this.value;
226
+ }
227
+ /**
228
+ * Check equality with another email
229
+ */
230
+ equals(other) {
231
+ return this.value === other.value;
232
+ }
233
+ /**
234
+ * Create Email from string (returns null if invalid)
235
+ */
236
+ static create(email) {
237
+ try {
238
+ return new _Email(email);
239
+ } catch {
240
+ return null;
241
+ }
242
+ }
243
+ };
244
+
245
+ // src/domain/errors/repository.errors.ts
246
+ var RepositoryError = class extends Error {
247
+ constructor(message, code, originalError) {
248
+ super(message);
249
+ this.code = code;
250
+ this.originalError = originalError;
251
+ this.name = "RepositoryError";
252
+ }
253
+ };
254
+ var RepositoryErrorCode = /* @__PURE__ */ ((RepositoryErrorCode2) => {
255
+ RepositoryErrorCode2["DOCUMENT_NOT_FOUND"] = "DOCUMENT_NOT_FOUND";
256
+ RepositoryErrorCode2["DOCUMENT_ALREADY_EXISTS"] = "DOCUMENT_ALREADY_EXISTS";
257
+ RepositoryErrorCode2["DOCUMENT_INVALID"] = "DOCUMENT_INVALID";
258
+ RepositoryErrorCode2["COLLECTION_NOT_FOUND"] = "COLLECTION_NOT_FOUND";
259
+ RepositoryErrorCode2["COLLECTION_INVALID"] = "COLLECTION_INVALID";
260
+ RepositoryErrorCode2["QUERY_INVALID"] = "QUERY_INVALID";
261
+ RepositoryErrorCode2["QUERY_FAILED"] = "QUERY_FAILED";
262
+ RepositoryErrorCode2["TRANSACTION_FAILED"] = "TRANSACTION_FAILED";
263
+ RepositoryErrorCode2["TRANSACTION_ABORTED"] = "TRANSACTION_ABORTED";
264
+ RepositoryErrorCode2["NETWORK_ERROR"] = "NETWORK_ERROR";
265
+ RepositoryErrorCode2["TIMEOUT"] = "TIMEOUT";
266
+ RepositoryErrorCode2["OFFLINE"] = "OFFLINE";
267
+ RepositoryErrorCode2["PERMISSION_DENIED"] = "PERMISSION_DENIED";
268
+ RepositoryErrorCode2["UNAUTHORIZED"] = "UNAUTHORIZED";
269
+ RepositoryErrorCode2["VALIDATION_FAILED"] = "VALIDATION_FAILED";
270
+ RepositoryErrorCode2["INVALID_DATA"] = "INVALID_DATA";
271
+ RepositoryErrorCode2["CONFLICT"] = "CONFLICT";
272
+ RepositoryErrorCode2["VERSION_MISMATCH"] = "VERSION_MISMATCH";
273
+ RepositoryErrorCode2["STORAGE_ERROR"] = "STORAGE_ERROR";
274
+ RepositoryErrorCode2["FILE_NOT_FOUND"] = "FILE_NOT_FOUND";
275
+ RepositoryErrorCode2["FILE_TOO_LARGE"] = "FILE_TOO_LARGE";
276
+ RepositoryErrorCode2["INVALID_FILE_TYPE"] = "INVALID_FILE_TYPE";
277
+ RepositoryErrorCode2["UNKNOWN"] = "UNKNOWN";
278
+ return RepositoryErrorCode2;
279
+ })(RepositoryErrorCode || {});
280
+ function createRepositoryError(code, message, originalError) {
281
+ const defaultMessage = getRepositoryErrorMessage(code);
282
+ return new RepositoryError(message || defaultMessage, code, originalError);
283
+ }
284
+ function getRepositoryErrorMessage(code) {
285
+ switch (code) {
286
+ case "DOCUMENT_NOT_FOUND" /* DOCUMENT_NOT_FOUND */:
287
+ return "Document not found";
288
+ case "DOCUMENT_ALREADY_EXISTS" /* DOCUMENT_ALREADY_EXISTS */:
289
+ return "Document already exists";
290
+ case "DOCUMENT_INVALID" /* DOCUMENT_INVALID */:
291
+ return "Document is invalid";
292
+ case "COLLECTION_NOT_FOUND" /* COLLECTION_NOT_FOUND */:
293
+ return "Collection not found";
294
+ case "COLLECTION_INVALID" /* COLLECTION_INVALID */:
295
+ return "Collection is invalid";
296
+ case "QUERY_INVALID" /* QUERY_INVALID */:
297
+ return "Query is invalid";
298
+ case "QUERY_FAILED" /* QUERY_FAILED */:
299
+ return "Query failed";
300
+ case "TRANSACTION_FAILED" /* TRANSACTION_FAILED */:
301
+ return "Transaction failed";
302
+ case "TRANSACTION_ABORTED" /* TRANSACTION_ABORTED */:
303
+ return "Transaction aborted";
304
+ case "NETWORK_ERROR" /* NETWORK_ERROR */:
305
+ return "Network error";
306
+ case "TIMEOUT" /* TIMEOUT */:
307
+ return "Request timeout";
308
+ case "OFFLINE" /* OFFLINE */:
309
+ return "Client is offline";
310
+ case "PERMISSION_DENIED" /* PERMISSION_DENIED */:
311
+ return "Permission denied";
312
+ case "UNAUTHORIZED" /* UNAUTHORIZED */:
313
+ return "Unauthorized";
314
+ case "VALIDATION_FAILED" /* VALIDATION_FAILED */:
315
+ return "Validation failed";
316
+ case "INVALID_DATA" /* INVALID_DATA */:
317
+ return "Invalid data";
318
+ case "CONFLICT" /* CONFLICT */:
319
+ return "Conflict occurred";
320
+ case "VERSION_MISMATCH" /* VERSION_MISMATCH */:
321
+ return "Version mismatch";
322
+ case "STORAGE_ERROR" /* STORAGE_ERROR */:
323
+ return "Storage error";
324
+ case "FILE_NOT_FOUND" /* FILE_NOT_FOUND */:
325
+ return "File not found";
326
+ case "FILE_TOO_LARGE" /* FILE_TOO_LARGE */:
327
+ return "File is too large";
328
+ case "INVALID_FILE_TYPE" /* INVALID_FILE_TYPE */:
329
+ return "Invalid file type";
330
+ case "UNKNOWN" /* UNKNOWN */:
331
+ default:
332
+ return "An unknown error occurred";
333
+ }
334
+ }
335
+
336
+ // src/domain/value-objects/user-id.vo.ts
337
+ var UserId = class _UserId {
338
+ value;
339
+ constructor(id) {
340
+ this.value = id;
341
+ this.validate();
342
+ }
343
+ /**
344
+ * Validate user ID
345
+ */
346
+ validate() {
347
+ if (!this.value) {
348
+ throw createRepositoryError("INVALID_DATA" /* INVALID_DATA */, "User ID cannot be empty");
349
+ }
350
+ if (this.value.length < 20) {
351
+ throw createRepositoryError(
352
+ "INVALID_DATA" /* INVALID_DATA */,
353
+ "User ID is too short (must be at least 20 characters)"
354
+ );
355
+ }
356
+ const validPattern = /^[a-zA-Z0-9_-]+$/;
357
+ if (!validPattern.test(this.value)) {
358
+ throw createRepositoryError(
359
+ "INVALID_DATA" /* INVALID_DATA */,
360
+ "User ID contains invalid characters"
361
+ );
362
+ }
363
+ }
364
+ /**
365
+ * Get user ID value
366
+ */
367
+ getValue() {
368
+ return this.value;
369
+ }
370
+ /**
371
+ * Check if this is a temporary ID (not yet persisted)
372
+ */
373
+ isTemporary() {
374
+ return this.value.startsWith("temp_");
375
+ }
376
+ /**
377
+ * Convert to string
378
+ */
379
+ toString() {
380
+ return this.value;
381
+ }
382
+ /**
383
+ * Check equality with another user ID
384
+ */
385
+ equals(other) {
386
+ return this.value === other.value;
387
+ }
388
+ /**
389
+ * Generate a temporary user ID
390
+ */
391
+ static generateTemp() {
392
+ return new _UserId(`temp_${Date.now()}_${Math.random().toString(36).substring(7)}`);
393
+ }
394
+ /**
395
+ * Create UserId from string (returns null if invalid)
396
+ */
397
+ static create(id) {
398
+ try {
399
+ return new _UserId(id);
400
+ } catch {
401
+ return null;
402
+ }
403
+ }
404
+ };
405
+
406
+ // src/domain/value-objects/file-path.vo.ts
407
+ var FilePath = class _FilePath {
408
+ value;
409
+ parts;
410
+ constructor(path) {
411
+ this.value = path.trim();
412
+ this.parts = this.value.split("/").filter((p) => p.length > 0);
413
+ this.validate();
414
+ }
415
+ /**
416
+ * Validate file path
417
+ */
418
+ validate() {
419
+ if (!this.value) {
420
+ throw createRepositoryError("INVALID_DATA" /* INVALID_DATA */, "File path cannot be empty");
421
+ }
422
+ if (this.value.startsWith("/") || this.value.endsWith("/")) {
423
+ throw createRepositoryError(
424
+ "INVALID_DATA" /* INVALID_DATA */,
425
+ "File path should not start or end with /"
426
+ );
427
+ }
428
+ if (this.value.includes("//")) {
429
+ throw createRepositoryError("INVALID_DATA" /* INVALID_DATA */, "File path should not contain //");
430
+ }
431
+ if (this.parts.length === 0) {
432
+ throw createRepositoryError("INVALID_DATA" /* INVALID_DATA */, "File path must have at least one segment");
433
+ }
434
+ for (const part of this.parts) {
435
+ if (/[<>:"|?*]/.test(part)) {
436
+ throw createRepositoryError(
437
+ "INVALID_DATA" /* INVALID_DATA */,
438
+ `Invalid characters in path segment: ${part}`
439
+ );
440
+ }
441
+ if (part === "." || part === "..") {
442
+ throw createRepositoryError(
443
+ "INVALID_DATA" /* INVALID_DATA */,
444
+ `Invalid path segment: ${part}`
445
+ );
446
+ }
447
+ }
448
+ }
449
+ /**
450
+ * Get file path value
451
+ */
452
+ getValue() {
453
+ return this.value;
454
+ }
455
+ /**
456
+ * Get path parts
457
+ */
458
+ getParts() {
459
+ return [...this.parts];
460
+ }
461
+ /**
462
+ * Get filename (last part of path)
463
+ */
464
+ getFileName() {
465
+ return this.parts[this.parts.length - 1] || "";
466
+ }
467
+ /**
468
+ * Get directory path (all parts except last)
469
+ */
470
+ getDirectory() {
471
+ return this.parts.slice(0, -1).join("/");
472
+ }
473
+ /**
474
+ * Get file extension
475
+ */
476
+ getExtension() {
477
+ const fileName = this.getFileName();
478
+ const lastDot = fileName.lastIndexOf(".");
479
+ return lastDot > 0 ? fileName.substring(lastDot + 1) : "";
480
+ }
481
+ /**
482
+ * Get file name without extension
483
+ */
484
+ getFileNameWithoutExtension() {
485
+ const fileName = this.getFileName();
486
+ const lastDot = fileName.lastIndexOf(".");
487
+ return lastDot > 0 ? fileName.substring(0, lastDot) : fileName;
488
+ }
489
+ /**
490
+ * Check if path is in a specific directory
491
+ */
492
+ isInDirectory(directory) {
493
+ return this.value.startsWith(directory + "/");
494
+ }
495
+ /**
496
+ * Check if file has a specific extension
497
+ */
498
+ hasExtension(extension) {
499
+ return this.getExtension().toLowerCase() === extension.toLowerCase();
500
+ }
501
+ /**
502
+ * Create a new path by appending segments
503
+ */
504
+ append(...segments) {
505
+ return new _FilePath([...this.parts, ...segments].join("/"));
506
+ }
507
+ /**
508
+ * Create a new path in a parent directory
509
+ */
510
+ withParent(parent) {
511
+ return new _FilePath([parent, ...this.parts].join("/"));
512
+ }
513
+ /**
514
+ * Create a new path with a different filename
515
+ */
516
+ withFileName(fileName) {
517
+ const dir = this.getDirectory();
518
+ return dir ? new _FilePath(`${dir}/${fileName}`) : new _FilePath(fileName);
519
+ }
520
+ /**
521
+ * Convert to string
522
+ */
523
+ toString() {
524
+ return this.value;
525
+ }
526
+ /**
527
+ * Check equality with another file path
528
+ */
529
+ equals(other) {
530
+ return this.value === other.value;
531
+ }
532
+ /**
533
+ * Create user path (users/{userId}/...)
534
+ */
535
+ static userPath(userId, ...segments) {
536
+ return new _FilePath(["users", userId, ...segments].join("/"));
537
+ }
538
+ /**
539
+ * Create public path (public/...)
540
+ */
541
+ static publicPath(...segments) {
542
+ return new _FilePath(["public", ...segments].join("/"));
543
+ }
544
+ /**
545
+ * Create FilePath from string (returns null if invalid)
546
+ */
547
+ static create(path) {
548
+ try {
549
+ return new _FilePath(path);
550
+ } catch {
551
+ return null;
552
+ }
553
+ }
554
+ };
555
+
556
+ // src/domain/errors/auth.errors.ts
557
+ var AuthError = class extends Error {
558
+ constructor(message, code, originalError) {
559
+ super(message);
560
+ this.code = code;
561
+ this.originalError = originalError;
562
+ this.name = "AuthError";
563
+ }
564
+ };
565
+ var AuthErrorCode = /* @__PURE__ */ ((AuthErrorCode2) => {
566
+ AuthErrorCode2["USER_NOT_FOUND"] = "USER_NOT_FOUND";
567
+ AuthErrorCode2["USER_ALREADY_EXISTS"] = "USER_ALREADY_EXISTS";
568
+ AuthErrorCode2["INVALID_CREDENTIALS"] = "INVALID_CREDENTIALS";
569
+ AuthErrorCode2["WEAK_PASSWORD"] = "WEAK_PASSWORD";
570
+ AuthErrorCode2["EMAIL_NOT_VERIFIED"] = "EMAIL_NOT_VERIFIED";
571
+ AuthErrorCode2["SESSION_EXPIRED"] = "SESSION_EXPIRED";
572
+ AuthErrorCode2["UNAUTHENTICATED"] = "UNAUTHENTICATED";
573
+ AuthErrorCode2["TOO_MANY_REQUESTS"] = "TOO_MANY_REQUESTS";
574
+ AuthErrorCode2["OAUTH_ERROR"] = "OAUTH_ERROR";
575
+ AuthErrorCode2["OAUTH_CANCELLED"] = "OAUTH_CANCELLED";
576
+ AuthErrorCode2["OAUTH_ACCOUNT_EXISTS"] = "OAUTH_ACCOUNT_EXISTS";
577
+ AuthErrorCode2["SIGN_IN_FAILED"] = "SIGN_IN_FAILED";
578
+ AuthErrorCode2["SIGN_UP_FAILED"] = "SIGN_UP_FAILED";
579
+ AuthErrorCode2["SIGN_OUT_FAILED"] = "SIGN_OUT_FAILED";
580
+ AuthErrorCode2["PASSWORD_RESET_FAILED"] = "PASSWORD_RESET_FAILED";
581
+ AuthErrorCode2["EMAIL_VERIFICATION_FAILED"] = "EMAIL_VERIFICATION_FAILED";
582
+ AuthErrorCode2["PROFILE_UPDATE_FAILED"] = "PROFILE_UPDATE_FAILED";
583
+ AuthErrorCode2["EMAIL_UPDATE_FAILED"] = "EMAIL_UPDATE_FAILED";
584
+ AuthErrorCode2["PASSWORD_UPDATE_FAILED"] = "PASSWORD_UPDATE_FAILED";
585
+ AuthErrorCode2["ACCOUNT_DELETE_FAILED"] = "ACCOUNT_DELETE_FAILED";
586
+ AuthErrorCode2["REAUTHENTICATION_REQUIRED"] = "REAUTHENTICATION_REQUIRED";
587
+ AuthErrorCode2["REAUTHENTICATION_FAILED"] = "REAUTHENTICATION_FAILED";
588
+ AuthErrorCode2["UNKNOWN"] = "UNKNOWN";
589
+ return AuthErrorCode2;
590
+ })(AuthErrorCode || {});
591
+ function createAuthError(code, message, originalError) {
592
+ const defaultMessage = getAuthErrorMessage(code);
593
+ return new AuthError(message || defaultMessage, code, originalError);
594
+ }
595
+ function getAuthErrorMessage(code) {
596
+ switch (code) {
597
+ case "USER_NOT_FOUND" /* USER_NOT_FOUND */:
598
+ return "User not found";
599
+ case "USER_ALREADY_EXISTS" /* USER_ALREADY_EXISTS */:
600
+ return "User already exists";
601
+ case "INVALID_CREDENTIALS" /* INVALID_CREDENTIALS */:
602
+ return "Invalid credentials";
603
+ case "WEAK_PASSWORD" /* WEAK_PASSWORD */:
604
+ return "Password is too weak";
605
+ case "EMAIL_NOT_VERIFIED" /* EMAIL_NOT_VERIFIED */:
606
+ return "Email not verified";
607
+ case "SESSION_EXPIRED" /* SESSION_EXPIRED */:
608
+ return "Session expired";
609
+ case "UNAUTHENTICATED" /* UNAUTHENTICATED */:
610
+ return "User not authenticated";
611
+ case "TOO_MANY_REQUESTS" /* TOO_MANY_REQUESTS */:
612
+ return "Too many requests";
613
+ case "OAUTH_ERROR" /* OAUTH_ERROR */:
614
+ return "OAuth error occurred";
615
+ case "OAUTH_CANCELLED" /* OAUTH_CANCELLED */:
616
+ return "OAuth cancelled by user";
617
+ case "OAUTH_ACCOUNT_EXISTS" /* OAUTH_ACCOUNT_EXISTS */:
618
+ return "Account already exists with this provider";
619
+ case "SIGN_IN_FAILED" /* SIGN_IN_FAILED */:
620
+ return "Sign in failed";
621
+ case "SIGN_UP_FAILED" /* SIGN_UP_FAILED */:
622
+ return "Sign up failed";
623
+ case "SIGN_OUT_FAILED" /* SIGN_OUT_FAILED */:
624
+ return "Sign out failed";
625
+ case "PASSWORD_RESET_FAILED" /* PASSWORD_RESET_FAILED */:
626
+ return "Password reset failed";
627
+ case "EMAIL_VERIFICATION_FAILED" /* EMAIL_VERIFICATION_FAILED */:
628
+ return "Email verification failed";
629
+ case "PROFILE_UPDATE_FAILED" /* PROFILE_UPDATE_FAILED */:
630
+ return "Profile update failed";
631
+ case "EMAIL_UPDATE_FAILED" /* EMAIL_UPDATE_FAILED */:
632
+ return "Email update failed";
633
+ case "PASSWORD_UPDATE_FAILED" /* PASSWORD_UPDATE_FAILED */:
634
+ return "Password update failed";
635
+ case "ACCOUNT_DELETE_FAILED" /* ACCOUNT_DELETE_FAILED */:
636
+ return "Account deletion failed";
637
+ case "REAUTHENTICATION_REQUIRED" /* REAUTHENTICATION_REQUIRED */:
638
+ return "Reauthentication required";
639
+ case "REAUTHENTICATION_FAILED" /* REAUTHENTICATION_FAILED */:
640
+ return "Reauthentication failed";
641
+ case "UNKNOWN" /* UNKNOWN */:
642
+ default:
643
+ return "An unknown error occurred";
644
+ }
645
+ }
646
+ // Annotate the CommonJS export names for ESM import in node:
647
+ 0 && (module.exports = {
648
+ AuthError,
649
+ AuthErrorCode,
650
+ Email,
651
+ FileErrorCode,
652
+ FilePath,
653
+ RepositoryError,
654
+ RepositoryErrorCode,
655
+ Timestamp,
656
+ USER_COLLECTIONS,
657
+ USER_SUBCOLLECTIONS,
658
+ UserId,
659
+ createAuthError,
660
+ createRepositoryError,
661
+ serverTimestamp
662
+ });
@@ -0,0 +1,36 @@
1
+ import {
2
+ Email,
3
+ FileErrorCode,
4
+ FilePath,
5
+ Timestamp,
6
+ USER_COLLECTIONS,
7
+ USER_SUBCOLLECTIONS,
8
+ UserId,
9
+ serverTimestamp
10
+ } from "../chunk-I6WGBPFB.mjs";
11
+ import {
12
+ RepositoryError,
13
+ RepositoryErrorCode,
14
+ createRepositoryError
15
+ } from "../chunk-4FP2ELQ5.mjs";
16
+ import {
17
+ AuthError,
18
+ AuthErrorCode,
19
+ createAuthError
20
+ } from "../chunk-RZ4QR6TB.mjs";
21
+ export {
22
+ AuthError,
23
+ AuthErrorCode,
24
+ Email,
25
+ FileErrorCode,
26
+ FilePath,
27
+ RepositoryError,
28
+ RepositoryErrorCode,
29
+ Timestamp,
30
+ USER_COLLECTIONS,
31
+ USER_SUBCOLLECTIONS,
32
+ UserId,
33
+ createAuthError,
34
+ createRepositoryError,
35
+ serverTimestamp
36
+ };