@umituz/web-firebase 2.1.1 → 3.0.0

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 (54) hide show
  1. package/package.json +12 -39
  2. package/src/domains/auth/entities/index.ts +60 -0
  3. package/src/domains/auth/index.ts +13 -0
  4. package/src/domains/auth/services/auth.service.ts +245 -0
  5. package/src/domains/auth/services/index.ts +7 -0
  6. package/src/domains/auth/types/auth-service.interface.ts +72 -0
  7. package/src/domains/auth/types/index.ts +5 -0
  8. package/src/domains/firestore/entities/index.ts +82 -0
  9. package/src/domains/firestore/index.ts +13 -0
  10. package/src/domains/firestore/services/firestore.service.ts +191 -0
  11. package/src/domains/firestore/services/index.ts +7 -0
  12. package/src/domains/firestore/types/firestore-service.interface.ts +64 -0
  13. package/src/domains/firestore/types/index.ts +5 -0
  14. package/src/domains/storage/entities/index.ts +94 -0
  15. package/src/domains/storage/index.ts +13 -0
  16. package/src/domains/storage/services/index.ts +7 -0
  17. package/src/domains/storage/services/storage.service.ts +223 -0
  18. package/src/domains/storage/types/index.ts +5 -0
  19. package/src/domains/storage/types/storage-service.interface.ts +120 -0
  20. package/src/index.ts +12 -16
  21. package/src/presentation/hooks/useAuth.ts +69 -26
  22. package/src/presentation/providers/FirebaseProvider.tsx +9 -14
  23. package/dist/application/index.d.mts +0 -273
  24. package/dist/application/index.d.ts +0 -273
  25. package/dist/application/index.js +0 -490
  26. package/dist/application/index.mjs +0 -19
  27. package/dist/chunk-34DL2QWQ.mjs +0 -87
  28. package/dist/chunk-4FP2ELQ5.mjs +0 -96
  29. package/dist/chunk-7TX3OU3O.mjs +0 -721
  30. package/dist/chunk-I6WGBPFB.mjs +0 -439
  31. package/dist/chunk-RZ4QR6TB.mjs +0 -96
  32. package/dist/chunk-U2XI4MGO.mjs +0 -397
  33. package/dist/domain/index.d.mts +0 -325
  34. package/dist/domain/index.d.ts +0 -325
  35. package/dist/domain/index.js +0 -662
  36. package/dist/domain/index.mjs +0 -36
  37. package/dist/file.repository.interface-v5vHgVsZ.d.mts +0 -241
  38. package/dist/file.repository.interface-v5vHgVsZ.d.ts +0 -241
  39. package/dist/firebase.entity-xvfEPjXZ.d.mts +0 -15
  40. package/dist/firebase.entity-xvfEPjXZ.d.ts +0 -15
  41. package/dist/index.d.mts +0 -14
  42. package/dist/index.d.ts +0 -14
  43. package/dist/index.js +0 -1833
  44. package/dist/index.mjs +0 -98
  45. package/dist/infrastructure/index.d.mts +0 -170
  46. package/dist/infrastructure/index.d.ts +0 -170
  47. package/dist/infrastructure/index.js +0 -856
  48. package/dist/infrastructure/index.mjs +0 -46
  49. package/dist/presentation/index.d.mts +0 -25
  50. package/dist/presentation/index.d.ts +0 -25
  51. package/dist/presentation/index.js +0 -105
  52. package/dist/presentation/index.mjs +0 -6
  53. package/dist/user.repository.interface-DS74TsJ5.d.mts +0 -298
  54. package/dist/user.repository.interface-DS74TsJ5.d.ts +0 -298
@@ -1,241 +0,0 @@
1
- /**
2
- * File Domain Entities
3
- * @description File and storage-related entities
4
- */
5
- /**
6
- * File Metadata Entity
7
- * Contains metadata about uploaded files
8
- */
9
- interface FileMetadata {
10
- readonly id: string;
11
- readonly name: string;
12
- readonly fullPath: string;
13
- readonly contentType: string;
14
- readonly size: number;
15
- readonly createdAt: number;
16
- readonly updatedAt: number;
17
- readonly userId: string;
18
- readonly type: FileType;
19
- category?: FileCategory;
20
- description?: string;
21
- tags?: string[];
22
- }
23
- /**
24
- * File Types
25
- */
26
- type FileType = 'image' | 'video' | 'audio' | 'document' | 'other';
27
- /**
28
- * File Categories
29
- */
30
- type FileCategory = 'profile' | 'content' | 'document' | 'attachment' | 'backup';
31
- /**
32
- * Upload Progress Entity
33
- * Tracks upload progress for resumable uploads
34
- */
35
- interface UploadProgress {
36
- bytesTransferred: number;
37
- totalBytes: number;
38
- progress: number;
39
- state: UploadState;
40
- speed?: number;
41
- remaining?: number;
42
- }
43
- /**
44
- * Upload States
45
- */
46
- type UploadState = 'paused' | 'running' | 'success' | 'canceled' | 'error';
47
- /**
48
- * File Upload Result Entity
49
- * Result of a file upload operation
50
- */
51
- interface FileUploadResult {
52
- readonly id: string;
53
- readonly name: string;
54
- readonly fullPath: string;
55
- readonly downloadURL: string;
56
- readonly contentType: string;
57
- readonly size: number;
58
- readonly createdAt: number;
59
- }
60
- type UploadResult = FileUploadResult;
61
- /**
62
- * Upload Options
63
- * Configuration for file uploads
64
- */
65
- interface UploadOptions {
66
- onProgress?: (progress: UploadProgress) => void;
67
- metadata?: FileMetadata;
68
- customMetadata?: Record<string, string>;
69
- }
70
- /**
71
- * File Validation Options
72
- */
73
- interface FileValidationOptions {
74
- maxSizeBytes?: number;
75
- maxSizeMB?: number;
76
- allowedTypes?: string[];
77
- allowedExtensions?: string[];
78
- }
79
- /**
80
- * Validation Result
81
- */
82
- interface ValidationResult {
83
- valid: boolean;
84
- error?: string;
85
- errorCode?: FileErrorCode;
86
- }
87
- /**
88
- * File Error Codes
89
- */
90
- declare enum FileErrorCode {
91
- FILE_TOO_LARGE = "FILE_TOO_LARGE",
92
- INVALID_TYPE = "INVALID_TYPE",
93
- INVALID_EXTENSION = "INVALID_EXTENSION",
94
- UPLOAD_FAILED = "UPLOAD_FAILED",
95
- DOWNLOAD_FAILED = "DOWNLOAD_FAILED",
96
- DELETE_FAILED = "DELETE_FAILED",
97
- FILE_NOT_FOUND = "FILE_NOT_FOUND",
98
- NETWORK_ERROR = "NETWORK_ERROR",
99
- CANCELLED = "CANCELLED"
100
- }
101
- /**
102
- * File Filters
103
- */
104
- interface FileFilters {
105
- type?: FileType;
106
- category?: FileCategory;
107
- startDate?: number;
108
- endDate?: number;
109
- minSize?: number;
110
- maxSize?: number;
111
- tags?: string[];
112
- }
113
- /**
114
- * File Query Result
115
- */
116
- interface FileQueryResult {
117
- files: FileMetadata[];
118
- totalCount: number;
119
- hasMore: boolean;
120
- lastDocId?: string;
121
- }
122
- /**
123
- * Storage Statistics
124
- */
125
- interface StorageStats {
126
- totalFiles: number;
127
- totalSize: number;
128
- filesByType: Record<FileType, number>;
129
- filesByCategory: Record<FileCategory, number>;
130
- lastUploadAt?: number;
131
- }
132
-
133
- /**
134
- * File Repository Interface
135
- * @description Defines contract for file storage operations
136
- */
137
-
138
- /**
139
- * File Repository Interface
140
- * Defines operations for file storage and management
141
- */
142
- interface IFileRepository {
143
- /**
144
- * Upload file to storage
145
- */
146
- uploadFile(userId: string, path: string, file: File | Blob, options?: UploadOptions): Promise<UploadResult>;
147
- /**
148
- * Upload image with automatic categorization
149
- */
150
- uploadImage(userId: string, file: File, filename?: string): Promise<UploadResult>;
151
- /**
152
- * Upload video with automatic categorization
153
- */
154
- uploadVideo(userId: string, file: File, filename?: string): Promise<UploadResult>;
155
- /**
156
- * Upload document with automatic categorization
157
- */
158
- uploadDocument(userId: string, file: File, filename?: string): Promise<UploadResult>;
159
- /**
160
- * Upload profile picture
161
- */
162
- uploadProfilePicture(userId: string, file: File): Promise<UploadResult>;
163
- /**
164
- * Get download URL for a file
165
- */
166
- getDownloadURL(path: string): Promise<string>;
167
- /**
168
- * Delete file by path
169
- */
170
- deleteFile(path: string): Promise<void>;
171
- /**
172
- * Delete all user files
173
- */
174
- deleteUserFiles(userId: string): Promise<void>;
175
- /**
176
- * Delete user image
177
- */
178
- deleteImage(userId: string, filename: string): Promise<void>;
179
- /**
180
- * Delete user video
181
- */
182
- deleteVideo(userId: string, filename: string): Promise<void>;
183
- /**
184
- * Delete profile picture
185
- */
186
- deleteProfilePicture(userId: string, filename: string): Promise<void>;
187
- /**
188
- * List user files
189
- */
190
- listUserFiles(userId: string, path?: string): Promise<string[]>;
191
- /**
192
- * List user images
193
- */
194
- listUserImages(userId: string): Promise<string[]>;
195
- /**
196
- * List user videos
197
- */
198
- listUserVideos(userId: string): Promise<string[]>;
199
- /**
200
- * Get file metadata
201
- */
202
- getFileMetadata(path: string): Promise<FileMetadata>;
203
- /**
204
- * Query files with filters
205
- */
206
- queryFiles(userId: string, filters?: FileFilters): Promise<FileQueryResult>;
207
- /**
208
- * Get storage statistics
209
- */
210
- getStorageStats(userId: string): Promise<StorageStats>;
211
- /**
212
- * Validate file before upload
213
- */
214
- validateFile(file: File, options?: {
215
- maxSizeBytes?: number;
216
- maxSizeMB?: number;
217
- allowedTypes?: string[];
218
- }): boolean;
219
- /**
220
- * Check if file is an image
221
- */
222
- isImageFile(file: File): boolean;
223
- /**
224
- * Check if file is a video
225
- */
226
- isVideoFile(file: File): boolean;
227
- /**
228
- * Check if file is a document
229
- */
230
- isDocumentFile(file: File): boolean;
231
- /**
232
- * Generate unique filename
233
- */
234
- generateUniqueFilename(originalName: string): string;
235
- /**
236
- * Get file extension
237
- */
238
- getFileExtension(filename: string): string;
239
- }
240
-
241
- export { type FileCategory as F, type IFileRepository as I, type StorageStats as S, type UploadOptions as U, type ValidationResult as V, FileErrorCode as a, type FileFilters as b, type FileMetadata as c, type FileQueryResult as d, type FileType as e, type FileUploadResult as f, type FileValidationOptions as g, type UploadProgress as h, type UploadResult as i, type UploadState as j };
@@ -1,241 +0,0 @@
1
- /**
2
- * File Domain Entities
3
- * @description File and storage-related entities
4
- */
5
- /**
6
- * File Metadata Entity
7
- * Contains metadata about uploaded files
8
- */
9
- interface FileMetadata {
10
- readonly id: string;
11
- readonly name: string;
12
- readonly fullPath: string;
13
- readonly contentType: string;
14
- readonly size: number;
15
- readonly createdAt: number;
16
- readonly updatedAt: number;
17
- readonly userId: string;
18
- readonly type: FileType;
19
- category?: FileCategory;
20
- description?: string;
21
- tags?: string[];
22
- }
23
- /**
24
- * File Types
25
- */
26
- type FileType = 'image' | 'video' | 'audio' | 'document' | 'other';
27
- /**
28
- * File Categories
29
- */
30
- type FileCategory = 'profile' | 'content' | 'document' | 'attachment' | 'backup';
31
- /**
32
- * Upload Progress Entity
33
- * Tracks upload progress for resumable uploads
34
- */
35
- interface UploadProgress {
36
- bytesTransferred: number;
37
- totalBytes: number;
38
- progress: number;
39
- state: UploadState;
40
- speed?: number;
41
- remaining?: number;
42
- }
43
- /**
44
- * Upload States
45
- */
46
- type UploadState = 'paused' | 'running' | 'success' | 'canceled' | 'error';
47
- /**
48
- * File Upload Result Entity
49
- * Result of a file upload operation
50
- */
51
- interface FileUploadResult {
52
- readonly id: string;
53
- readonly name: string;
54
- readonly fullPath: string;
55
- readonly downloadURL: string;
56
- readonly contentType: string;
57
- readonly size: number;
58
- readonly createdAt: number;
59
- }
60
- type UploadResult = FileUploadResult;
61
- /**
62
- * Upload Options
63
- * Configuration for file uploads
64
- */
65
- interface UploadOptions {
66
- onProgress?: (progress: UploadProgress) => void;
67
- metadata?: FileMetadata;
68
- customMetadata?: Record<string, string>;
69
- }
70
- /**
71
- * File Validation Options
72
- */
73
- interface FileValidationOptions {
74
- maxSizeBytes?: number;
75
- maxSizeMB?: number;
76
- allowedTypes?: string[];
77
- allowedExtensions?: string[];
78
- }
79
- /**
80
- * Validation Result
81
- */
82
- interface ValidationResult {
83
- valid: boolean;
84
- error?: string;
85
- errorCode?: FileErrorCode;
86
- }
87
- /**
88
- * File Error Codes
89
- */
90
- declare enum FileErrorCode {
91
- FILE_TOO_LARGE = "FILE_TOO_LARGE",
92
- INVALID_TYPE = "INVALID_TYPE",
93
- INVALID_EXTENSION = "INVALID_EXTENSION",
94
- UPLOAD_FAILED = "UPLOAD_FAILED",
95
- DOWNLOAD_FAILED = "DOWNLOAD_FAILED",
96
- DELETE_FAILED = "DELETE_FAILED",
97
- FILE_NOT_FOUND = "FILE_NOT_FOUND",
98
- NETWORK_ERROR = "NETWORK_ERROR",
99
- CANCELLED = "CANCELLED"
100
- }
101
- /**
102
- * File Filters
103
- */
104
- interface FileFilters {
105
- type?: FileType;
106
- category?: FileCategory;
107
- startDate?: number;
108
- endDate?: number;
109
- minSize?: number;
110
- maxSize?: number;
111
- tags?: string[];
112
- }
113
- /**
114
- * File Query Result
115
- */
116
- interface FileQueryResult {
117
- files: FileMetadata[];
118
- totalCount: number;
119
- hasMore: boolean;
120
- lastDocId?: string;
121
- }
122
- /**
123
- * Storage Statistics
124
- */
125
- interface StorageStats {
126
- totalFiles: number;
127
- totalSize: number;
128
- filesByType: Record<FileType, number>;
129
- filesByCategory: Record<FileCategory, number>;
130
- lastUploadAt?: number;
131
- }
132
-
133
- /**
134
- * File Repository Interface
135
- * @description Defines contract for file storage operations
136
- */
137
-
138
- /**
139
- * File Repository Interface
140
- * Defines operations for file storage and management
141
- */
142
- interface IFileRepository {
143
- /**
144
- * Upload file to storage
145
- */
146
- uploadFile(userId: string, path: string, file: File | Blob, options?: UploadOptions): Promise<UploadResult>;
147
- /**
148
- * Upload image with automatic categorization
149
- */
150
- uploadImage(userId: string, file: File, filename?: string): Promise<UploadResult>;
151
- /**
152
- * Upload video with automatic categorization
153
- */
154
- uploadVideo(userId: string, file: File, filename?: string): Promise<UploadResult>;
155
- /**
156
- * Upload document with automatic categorization
157
- */
158
- uploadDocument(userId: string, file: File, filename?: string): Promise<UploadResult>;
159
- /**
160
- * Upload profile picture
161
- */
162
- uploadProfilePicture(userId: string, file: File): Promise<UploadResult>;
163
- /**
164
- * Get download URL for a file
165
- */
166
- getDownloadURL(path: string): Promise<string>;
167
- /**
168
- * Delete file by path
169
- */
170
- deleteFile(path: string): Promise<void>;
171
- /**
172
- * Delete all user files
173
- */
174
- deleteUserFiles(userId: string): Promise<void>;
175
- /**
176
- * Delete user image
177
- */
178
- deleteImage(userId: string, filename: string): Promise<void>;
179
- /**
180
- * Delete user video
181
- */
182
- deleteVideo(userId: string, filename: string): Promise<void>;
183
- /**
184
- * Delete profile picture
185
- */
186
- deleteProfilePicture(userId: string, filename: string): Promise<void>;
187
- /**
188
- * List user files
189
- */
190
- listUserFiles(userId: string, path?: string): Promise<string[]>;
191
- /**
192
- * List user images
193
- */
194
- listUserImages(userId: string): Promise<string[]>;
195
- /**
196
- * List user videos
197
- */
198
- listUserVideos(userId: string): Promise<string[]>;
199
- /**
200
- * Get file metadata
201
- */
202
- getFileMetadata(path: string): Promise<FileMetadata>;
203
- /**
204
- * Query files with filters
205
- */
206
- queryFiles(userId: string, filters?: FileFilters): Promise<FileQueryResult>;
207
- /**
208
- * Get storage statistics
209
- */
210
- getStorageStats(userId: string): Promise<StorageStats>;
211
- /**
212
- * Validate file before upload
213
- */
214
- validateFile(file: File, options?: {
215
- maxSizeBytes?: number;
216
- maxSizeMB?: number;
217
- allowedTypes?: string[];
218
- }): boolean;
219
- /**
220
- * Check if file is an image
221
- */
222
- isImageFile(file: File): boolean;
223
- /**
224
- * Check if file is a video
225
- */
226
- isVideoFile(file: File): boolean;
227
- /**
228
- * Check if file is a document
229
- */
230
- isDocumentFile(file: File): boolean;
231
- /**
232
- * Generate unique filename
233
- */
234
- generateUniqueFilename(originalName: string): string;
235
- /**
236
- * Get file extension
237
- */
238
- getFileExtension(filename: string): string;
239
- }
240
-
241
- export { type FileCategory as F, type IFileRepository as I, type StorageStats as S, type UploadOptions as U, type ValidationResult as V, FileErrorCode as a, type FileFilters as b, type FileMetadata as c, type FileQueryResult as d, type FileType as e, type FileUploadResult as f, type FileValidationOptions as g, type UploadProgress as h, type UploadResult as i, type UploadState as j };
@@ -1,15 +0,0 @@
1
- /**
2
- * Firebase Entity Types
3
- */
4
- type FirebaseTimestamp = {
5
- toDate(): Date;
6
- } | Date;
7
- interface FirebaseUser {
8
- uid: string;
9
- email: string | null;
10
- displayName: string | null;
11
- photoURL: string | null;
12
- emailVerified: boolean;
13
- }
14
-
15
- export type { FirebaseTimestamp as F, FirebaseUser as a };
@@ -1,15 +0,0 @@
1
- /**
2
- * Firebase Entity Types
3
- */
4
- type FirebaseTimestamp = {
5
- toDate(): Date;
6
- } | Date;
7
- interface FirebaseUser {
8
- uid: string;
9
- email: string | null;
10
- displayName: string | null;
11
- photoURL: string | null;
12
- emailVerified: boolean;
13
- }
14
-
15
- export type { FirebaseTimestamp as F, FirebaseUser as a };
package/dist/index.d.mts DELETED
@@ -1,14 +0,0 @@
1
- export { F as FirebaseTimestamp, a as FirebaseUser } from './firebase.entity-xvfEPjXZ.mjs';
2
- export { A as AccountMetrics, I as IAuthRepository, a as IUserRepository, P as PlatformBreakdown, U as USER_COLLECTIONS, b as USER_SUBCOLLECTIONS, c as User, d as UserAnalytics, e as UserConnectedAccount, f as UserContent, g as UserCredits, h as UserNotifications, i as UserPrivacy, j as UserProfile, k as UserSettings, l as UserSubscription } from './user.repository.interface-DS74TsJ5.mjs';
3
- export { F as FileCategory, a as FileErrorCode, b as FileFilters, c as FileMetadata, d as FileQueryResult, e as FileType, f as FileUploadResult, g as FileValidationOptions, I as IFileRepository, S as StorageStats, U as UploadOptions, h as UploadProgress, i as UploadResult, j as UploadState, V as ValidationResult } from './file.repository.interface-v5vHgVsZ.mjs';
4
- export { AuthError, AuthErrorCode, Email, FilePath, IBaseRepository, RepositoryError, RepositoryErrorCode, ServerTimestamp, Timestamp, TimestampField, UserId, createAuthError, createRepositoryError, serverTimestamp } from './domain/index.mjs';
5
- export { CreateUserDTO, DeleteAccountDTO, DeleteAccountUseCase, ResetPasswordDTO, ResetPasswordUseCase, SignInDTO, SignInUseCase, SignInWithGoogleUseCase, SignOutUseCase, SignUpDTO, SignUpResult, SignUpUseCase, UpdateEmailDTO, UpdatePasswordDTO, UpdateProfileDTO, UpdateProfileUseCase, UpdateUserDTO, UpdateUserSettingsDTO, UpdateUserSubscriptionDTO, UserQueryResult } from './application/index.mjs';
6
- export { AuthAdapter, FirebaseInstances, FirestoreAdapter, StorageAdapter, StorageUploadResult, analytics, app, auth, db, deleteFile, functions, getFirebaseAnalytics, getFirebaseApp, getFirebaseAuth, getFirebaseDB, getFirebaseFunctions, getFirebaseInstances, getFirebaseStorage, initializeFirebase, storage, uploadBase64, uploadFile } from './infrastructure/index.mjs';
7
- export { UseFirebaseAuthOptions, UseFirebaseAuthReturn, useFirebaseAuth } from './presentation/index.mjs';
8
- import 'firebase/auth';
9
- import 'firebase/firestore';
10
- import 'firebase/app';
11
- import 'firebase/storage';
12
- import 'firebase/analytics';
13
- import 'firebase/functions';
14
- import '@firebase/util';
package/dist/index.d.ts DELETED
@@ -1,14 +0,0 @@
1
- export { F as FirebaseTimestamp, a as FirebaseUser } from './firebase.entity-xvfEPjXZ.js';
2
- export { A as AccountMetrics, I as IAuthRepository, a as IUserRepository, P as PlatformBreakdown, U as USER_COLLECTIONS, b as USER_SUBCOLLECTIONS, c as User, d as UserAnalytics, e as UserConnectedAccount, f as UserContent, g as UserCredits, h as UserNotifications, i as UserPrivacy, j as UserProfile, k as UserSettings, l as UserSubscription } from './user.repository.interface-DS74TsJ5.js';
3
- export { F as FileCategory, a as FileErrorCode, b as FileFilters, c as FileMetadata, d as FileQueryResult, e as FileType, f as FileUploadResult, g as FileValidationOptions, I as IFileRepository, S as StorageStats, U as UploadOptions, h as UploadProgress, i as UploadResult, j as UploadState, V as ValidationResult } from './file.repository.interface-v5vHgVsZ.js';
4
- export { AuthError, AuthErrorCode, Email, FilePath, IBaseRepository, RepositoryError, RepositoryErrorCode, ServerTimestamp, Timestamp, TimestampField, UserId, createAuthError, createRepositoryError, serverTimestamp } from './domain/index.js';
5
- export { CreateUserDTO, DeleteAccountDTO, DeleteAccountUseCase, ResetPasswordDTO, ResetPasswordUseCase, SignInDTO, SignInUseCase, SignInWithGoogleUseCase, SignOutUseCase, SignUpDTO, SignUpResult, SignUpUseCase, UpdateEmailDTO, UpdatePasswordDTO, UpdateProfileDTO, UpdateProfileUseCase, UpdateUserDTO, UpdateUserSettingsDTO, UpdateUserSubscriptionDTO, UserQueryResult } from './application/index.js';
6
- export { AuthAdapter, FirebaseInstances, FirestoreAdapter, StorageAdapter, StorageUploadResult, analytics, app, auth, db, deleteFile, functions, getFirebaseAnalytics, getFirebaseApp, getFirebaseAuth, getFirebaseDB, getFirebaseFunctions, getFirebaseInstances, getFirebaseStorage, initializeFirebase, storage, uploadBase64, uploadFile } from './infrastructure/index.js';
7
- export { UseFirebaseAuthOptions, UseFirebaseAuthReturn, useFirebaseAuth } from './presentation/index.js';
8
- import 'firebase/auth';
9
- import 'firebase/firestore';
10
- import 'firebase/app';
11
- import 'firebase/storage';
12
- import 'firebase/analytics';
13
- import 'firebase/functions';
14
- import '@firebase/util';