@umituz/react-native-firebase 1.13.37 → 1.13.38
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/scripts/auth.d.ts +39 -0
- package/dist/scripts/auth.d.ts.map +1 -0
- package/dist/scripts/auth.js +114 -0
- package/dist/scripts/auth.js.map +1 -0
- package/dist/scripts/firestore.d.ts +53 -0
- package/dist/scripts/firestore.d.ts.map +1 -0
- package/dist/scripts/firestore.js +217 -0
- package/dist/scripts/firestore.js.map +1 -0
- package/dist/scripts/index.d.ts +25 -0
- package/dist/scripts/index.d.ts.map +1 -0
- package/dist/scripts/index.js +68 -0
- package/dist/scripts/index.js.map +1 -0
- package/dist/scripts/init.d.ts +29 -0
- package/dist/scripts/init.d.ts.map +1 -0
- package/dist/scripts/init.js +91 -0
- package/dist/scripts/init.js.map +1 -0
- package/dist/scripts/storage.d.ts +31 -0
- package/dist/scripts/storage.d.ts.map +1 -0
- package/dist/scripts/storage.js +93 -0
- package/dist/scripts/storage.js.map +1 -0
- package/dist/scripts/types.d.ts +49 -0
- package/dist/scripts/types.d.ts.map +1 -0
- package/dist/scripts/types.js +7 -0
- package/dist/scripts/types.js.map +1 -0
- package/dist/scripts/utils.d.ts +45 -0
- package/dist/scripts/utils.d.ts.map +1 -0
- package/dist/scripts/utils.js +93 -0
- package/dist/scripts/utils.js.map +1 -0
- package/package.json +10 -3
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Firebase Admin Auth Utilities
|
|
3
|
+
* Generic auth operations for admin scripts
|
|
4
|
+
*/
|
|
5
|
+
import * as admin from "firebase-admin";
|
|
6
|
+
import type { UserInfo, CleanupResult } from "./types";
|
|
7
|
+
/**
|
|
8
|
+
* List all users from Firebase Auth
|
|
9
|
+
*/
|
|
10
|
+
export declare function listAllUsers(auth: admin.auth.Auth): Promise<UserInfo[]>;
|
|
11
|
+
/**
|
|
12
|
+
* List only authenticated users (with email/providers)
|
|
13
|
+
*/
|
|
14
|
+
export declare function listAuthenticatedUsers(auth: admin.auth.Auth): Promise<UserInfo[]>;
|
|
15
|
+
/**
|
|
16
|
+
* List only anonymous users
|
|
17
|
+
*/
|
|
18
|
+
export declare function listAnonymousUsers(auth: admin.auth.Auth): Promise<UserInfo[]>;
|
|
19
|
+
/**
|
|
20
|
+
* Delete users by UIDs
|
|
21
|
+
*/
|
|
22
|
+
export declare function deleteUsers(auth: admin.auth.Auth, uids: string[], onProgress?: (deleted: number, total: number) => void): Promise<CleanupResult>;
|
|
23
|
+
/**
|
|
24
|
+
* Cleanup anonymous users - delete all users without providers
|
|
25
|
+
*/
|
|
26
|
+
export declare function cleanupAnonymousUsers(auth: admin.auth.Auth, onProgress?: (deleted: number, total: number) => void): Promise<CleanupResult>;
|
|
27
|
+
/**
|
|
28
|
+
* Delete all users from Firebase Auth
|
|
29
|
+
*/
|
|
30
|
+
export declare function deleteAllUsers(auth: admin.auth.Auth, onProgress?: (deleted: number, total: number) => void): Promise<CleanupResult>;
|
|
31
|
+
/**
|
|
32
|
+
* Get user statistics
|
|
33
|
+
*/
|
|
34
|
+
export declare function getUserStats(auth: admin.auth.Auth): Promise<{
|
|
35
|
+
total: number;
|
|
36
|
+
anonymous: number;
|
|
37
|
+
authenticated: number;
|
|
38
|
+
}>;
|
|
39
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../scripts/auth.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,KAAK,MAAM,gBAAgB,CAAC;AACxC,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAEvD;;GAEG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAwB7E;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,GACpB,OAAO,CAAC,QAAQ,EAAE,CAAC,CAGrB;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,GACpB,OAAO,CAAC,QAAQ,EAAE,CAAC,CAGrB;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,EACrB,IAAI,EAAE,MAAM,EAAE,EACd,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,GACpD,OAAO,CAAC,aAAa,CAAC,CAmBxB;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,EACrB,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,GACpD,OAAO,CAAC,aAAa,CAAC,CAoBxB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,EACrB,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,GACpD,OAAO,CAAC,aAAa,CAAC,CAIxB;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC;IACjE,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC,CASD"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Firebase Admin Auth Utilities
|
|
4
|
+
* Generic auth operations for admin scripts
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.listAllUsers = listAllUsers;
|
|
8
|
+
exports.listAuthenticatedUsers = listAuthenticatedUsers;
|
|
9
|
+
exports.listAnonymousUsers = listAnonymousUsers;
|
|
10
|
+
exports.deleteUsers = deleteUsers;
|
|
11
|
+
exports.cleanupAnonymousUsers = cleanupAnonymousUsers;
|
|
12
|
+
exports.deleteAllUsers = deleteAllUsers;
|
|
13
|
+
exports.getUserStats = getUserStats;
|
|
14
|
+
/**
|
|
15
|
+
* List all users from Firebase Auth
|
|
16
|
+
*/
|
|
17
|
+
async function listAllUsers(auth) {
|
|
18
|
+
const users = [];
|
|
19
|
+
let nextPageToken;
|
|
20
|
+
do {
|
|
21
|
+
const result = await auth.listUsers(1000, nextPageToken);
|
|
22
|
+
result.users.forEach((user) => {
|
|
23
|
+
users.push({
|
|
24
|
+
uid: user.uid,
|
|
25
|
+
email: user.email,
|
|
26
|
+
displayName: user.displayName,
|
|
27
|
+
isAnonymous: !user.providerData || user.providerData.length === 0,
|
|
28
|
+
createdAt: user.metadata.creationTime
|
|
29
|
+
? new Date(user.metadata.creationTime)
|
|
30
|
+
: undefined,
|
|
31
|
+
providerCount: user.providerData?.length ?? 0,
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
nextPageToken = result.pageToken;
|
|
35
|
+
} while (nextPageToken);
|
|
36
|
+
return users;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* List only authenticated users (with email/providers)
|
|
40
|
+
*/
|
|
41
|
+
async function listAuthenticatedUsers(auth) {
|
|
42
|
+
const allUsers = await listAllUsers(auth);
|
|
43
|
+
return allUsers.filter((user) => !user.isAnonymous && user.email);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* List only anonymous users
|
|
47
|
+
*/
|
|
48
|
+
async function listAnonymousUsers(auth) {
|
|
49
|
+
const allUsers = await listAllUsers(auth);
|
|
50
|
+
return allUsers.filter((user) => user.isAnonymous);
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Delete users by UIDs
|
|
54
|
+
*/
|
|
55
|
+
async function deleteUsers(auth, uids, onProgress) {
|
|
56
|
+
const result = {
|
|
57
|
+
totalProcessed: uids.length,
|
|
58
|
+
deleted: 0,
|
|
59
|
+
preserved: 0,
|
|
60
|
+
errors: [],
|
|
61
|
+
};
|
|
62
|
+
for (const uid of uids) {
|
|
63
|
+
try {
|
|
64
|
+
await auth.deleteUser(uid);
|
|
65
|
+
result.deleted++;
|
|
66
|
+
onProgress?.(result.deleted, uids.length);
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
result.errors.push(`Failed to delete ${uid}: ${error}`);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return result;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Cleanup anonymous users - delete all users without providers
|
|
76
|
+
*/
|
|
77
|
+
async function cleanupAnonymousUsers(auth, onProgress) {
|
|
78
|
+
const anonymousUsers = await listAnonymousUsers(auth);
|
|
79
|
+
const uids = anonymousUsers.map((u) => u.uid);
|
|
80
|
+
if (uids.length === 0) {
|
|
81
|
+
return {
|
|
82
|
+
totalProcessed: 0,
|
|
83
|
+
deleted: 0,
|
|
84
|
+
preserved: 0,
|
|
85
|
+
errors: [],
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
const deleteResult = await deleteUsers(auth, uids, onProgress);
|
|
89
|
+
// Count preserved (authenticated) users
|
|
90
|
+
const authenticatedUsers = await listAuthenticatedUsers(auth);
|
|
91
|
+
deleteResult.preserved = authenticatedUsers.length;
|
|
92
|
+
return deleteResult;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Delete all users from Firebase Auth
|
|
96
|
+
*/
|
|
97
|
+
async function deleteAllUsers(auth, onProgress) {
|
|
98
|
+
const allUsers = await listAllUsers(auth);
|
|
99
|
+
const uids = allUsers.map((u) => u.uid);
|
|
100
|
+
return deleteUsers(auth, uids, onProgress);
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Get user statistics
|
|
104
|
+
*/
|
|
105
|
+
async function getUserStats(auth) {
|
|
106
|
+
const allUsers = await listAllUsers(auth);
|
|
107
|
+
const anonymous = allUsers.filter((u) => u.isAnonymous).length;
|
|
108
|
+
return {
|
|
109
|
+
total: allUsers.length,
|
|
110
|
+
anonymous,
|
|
111
|
+
authenticated: allUsers.length - anonymous,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../scripts/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Firebase Admin Firestore Utilities
|
|
3
|
+
* Generic Firestore operations for admin scripts
|
|
4
|
+
*/
|
|
5
|
+
import * as admin from "firebase-admin";
|
|
6
|
+
import type { CollectionInfo, BatchResult } from "./types";
|
|
7
|
+
/**
|
|
8
|
+
* List all root-level collections
|
|
9
|
+
*/
|
|
10
|
+
export declare function listCollections(db: admin.firestore.Firestore): Promise<CollectionInfo[]>;
|
|
11
|
+
/**
|
|
12
|
+
* List subcollections for a user document
|
|
13
|
+
*/
|
|
14
|
+
export declare function listUserSubcollections(db: admin.firestore.Firestore, userId: string): Promise<CollectionInfo[]>;
|
|
15
|
+
/**
|
|
16
|
+
* Delete collection in batches
|
|
17
|
+
*/
|
|
18
|
+
export declare function deleteCollection(db: admin.firestore.Firestore, collectionPath: string, onProgress?: (deleted: number) => void): Promise<number>;
|
|
19
|
+
/**
|
|
20
|
+
* Delete user subcollection for all users
|
|
21
|
+
*/
|
|
22
|
+
export declare function deleteUserSubcollection(db: admin.firestore.Firestore, subcollectionName: string, onProgress?: (deleted: number) => void): Promise<number>;
|
|
23
|
+
/**
|
|
24
|
+
* Delete all Firestore data
|
|
25
|
+
*/
|
|
26
|
+
export declare function deleteAllData(db: admin.firestore.Firestore, onProgress?: (collection: string, deleted: number) => void): Promise<number>;
|
|
27
|
+
/**
|
|
28
|
+
* Seed documents in batches
|
|
29
|
+
*/
|
|
30
|
+
export declare function seedBatch(db: admin.firestore.Firestore, collectionPath: string, docs: Array<{
|
|
31
|
+
id: string;
|
|
32
|
+
data: Record<string, unknown>;
|
|
33
|
+
}>): Promise<BatchResult>;
|
|
34
|
+
/**
|
|
35
|
+
* Seed user subcollection
|
|
36
|
+
*/
|
|
37
|
+
export declare function seedUserSubcollection(db: admin.firestore.Firestore, userId: string, subcollectionName: string, docs: Array<{
|
|
38
|
+
id: string;
|
|
39
|
+
data: Record<string, unknown>;
|
|
40
|
+
}>): Promise<BatchResult>;
|
|
41
|
+
/**
|
|
42
|
+
* Count documents in collection
|
|
43
|
+
*/
|
|
44
|
+
export declare function countDocuments(db: admin.firestore.Firestore, collectionPath: string): Promise<number>;
|
|
45
|
+
/**
|
|
46
|
+
* Get user document count statistics
|
|
47
|
+
*/
|
|
48
|
+
export declare function getUserStats(db: admin.firestore.Firestore): Promise<{
|
|
49
|
+
total: number;
|
|
50
|
+
anonymous: number;
|
|
51
|
+
authenticated: number;
|
|
52
|
+
}>;
|
|
53
|
+
//# sourceMappingURL=firestore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"firestore.d.ts","sourceRoot":"","sources":["../../scripts/firestore.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,KAAK,MAAM,gBAAgB,CAAC;AACxC,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAI3D;;GAEG;AACH,wBAAsB,eAAe,CACnC,EAAE,EAAE,KAAK,CAAC,SAAS,CAAC,SAAS,GAC5B,OAAO,CAAC,cAAc,EAAE,CAAC,CAqB3B;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,EAAE,EAAE,KAAK,CAAC,SAAS,CAAC,SAAS,EAC7B,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,cAAc,EAAE,CAAC,CAc3B;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,EAAE,EAAE,KAAK,CAAC,SAAS,CAAC,SAAS,EAC7B,cAAc,EAAE,MAAM,EACtB,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GACrC,OAAO,CAAC,MAAM,CAAC,CAyBjB;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAC3C,EAAE,EAAE,KAAK,CAAC,SAAS,CAAC,SAAS,EAC7B,iBAAiB,EAAE,MAAM,EACzB,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GACrC,OAAO,CAAC,MAAM,CAAC,CAkBjB;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,EAAE,EAAE,KAAK,CAAC,SAAS,CAAC,SAAS,EAC7B,UAAU,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,GACzD,OAAO,CAAC,MAAM,CAAC,CAkCjB;AAED;;GAEG;AACH,wBAAsB,SAAS,CAC7B,EAAE,EAAE,KAAK,CAAC,SAAS,CAAC,SAAS,EAC7B,cAAc,EAAE,MAAM,EACtB,IAAI,EAAE,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CAAC,GACzD,OAAO,CAAC,WAAW,CAAC,CA6BtB;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,EAAE,EAAE,KAAK,CAAC,SAAS,CAAC,SAAS,EAC7B,MAAM,EAAE,MAAM,EACd,iBAAiB,EAAE,MAAM,EACzB,IAAI,EAAE,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CAAC,GACzD,OAAO,CAAC,WAAW,CAAC,CA8BtB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,EAAE,EAAE,KAAK,CAAC,SAAS,CAAC,SAAS,EAC7B,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,MAAM,CAAC,CAGjB;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,EAAE,EAAE,KAAK,CAAC,SAAS,CAAC,SAAS,GAAG,OAAO,CAAC;IACzE,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC,CAoBD"}
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Firebase Admin Firestore Utilities
|
|
4
|
+
* Generic Firestore operations for admin scripts
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.listCollections = listCollections;
|
|
8
|
+
exports.listUserSubcollections = listUserSubcollections;
|
|
9
|
+
exports.deleteCollection = deleteCollection;
|
|
10
|
+
exports.deleteUserSubcollection = deleteUserSubcollection;
|
|
11
|
+
exports.deleteAllData = deleteAllData;
|
|
12
|
+
exports.seedBatch = seedBatch;
|
|
13
|
+
exports.seedUserSubcollection = seedUserSubcollection;
|
|
14
|
+
exports.countDocuments = countDocuments;
|
|
15
|
+
exports.getUserStats = getUserStats;
|
|
16
|
+
const BATCH_SIZE = 500;
|
|
17
|
+
/**
|
|
18
|
+
* List all root-level collections
|
|
19
|
+
*/
|
|
20
|
+
async function listCollections(db) {
|
|
21
|
+
const collections = await db.listCollections();
|
|
22
|
+
const result = [];
|
|
23
|
+
for (const collection of collections) {
|
|
24
|
+
const snapshot = await collection.limit(1000).get();
|
|
25
|
+
const info = {
|
|
26
|
+
name: collection.id,
|
|
27
|
+
documentCount: snapshot.docs.length,
|
|
28
|
+
sampleDocumentId: snapshot.docs[0]?.id,
|
|
29
|
+
};
|
|
30
|
+
if (!snapshot.empty) {
|
|
31
|
+
const subcollections = await snapshot.docs[0].ref.listCollections();
|
|
32
|
+
info.hasSubcollections = subcollections.length > 0;
|
|
33
|
+
}
|
|
34
|
+
result.push(info);
|
|
35
|
+
}
|
|
36
|
+
return result.sort((a, b) => b.documentCount - a.documentCount);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* List subcollections for a user document
|
|
40
|
+
*/
|
|
41
|
+
async function listUserSubcollections(db, userId) {
|
|
42
|
+
const userRef = db.collection("users").doc(userId);
|
|
43
|
+
const subcollections = await userRef.listCollections();
|
|
44
|
+
const result = [];
|
|
45
|
+
for (const subcollection of subcollections) {
|
|
46
|
+
const count = await subcollection.count().get();
|
|
47
|
+
result.push({
|
|
48
|
+
name: subcollection.id,
|
|
49
|
+
documentCount: count.data().count,
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
return result;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Delete collection in batches
|
|
56
|
+
*/
|
|
57
|
+
async function deleteCollection(db, collectionPath, onProgress) {
|
|
58
|
+
let totalDeleted = 0;
|
|
59
|
+
let hasMore = true;
|
|
60
|
+
while (hasMore) {
|
|
61
|
+
const snapshot = await db
|
|
62
|
+
.collection(collectionPath)
|
|
63
|
+
.orderBy("__name__")
|
|
64
|
+
.limit(BATCH_SIZE)
|
|
65
|
+
.get();
|
|
66
|
+
if (snapshot.empty) {
|
|
67
|
+
hasMore = false;
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
const batch = db.batch();
|
|
71
|
+
snapshot.docs.forEach((doc) => batch.delete(doc.ref));
|
|
72
|
+
await batch.commit();
|
|
73
|
+
totalDeleted += snapshot.docs.length;
|
|
74
|
+
onProgress?.(totalDeleted);
|
|
75
|
+
}
|
|
76
|
+
return totalDeleted;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Delete user subcollection for all users
|
|
80
|
+
*/
|
|
81
|
+
async function deleteUserSubcollection(db, subcollectionName, onProgress) {
|
|
82
|
+
let totalDeleted = 0;
|
|
83
|
+
const usersSnapshot = await db.collection("users").get();
|
|
84
|
+
for (const userDoc of usersSnapshot.docs) {
|
|
85
|
+
const subcollectionRef = userDoc.ref.collection(subcollectionName);
|
|
86
|
+
const subcollectionSnapshot = await subcollectionRef.get();
|
|
87
|
+
if (!subcollectionSnapshot.empty) {
|
|
88
|
+
const batch = db.batch();
|
|
89
|
+
subcollectionSnapshot.docs.forEach((doc) => batch.delete(doc.ref));
|
|
90
|
+
await batch.commit();
|
|
91
|
+
totalDeleted += subcollectionSnapshot.docs.length;
|
|
92
|
+
onProgress?.(totalDeleted);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return totalDeleted;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Delete all Firestore data
|
|
99
|
+
*/
|
|
100
|
+
async function deleteAllData(db, onProgress) {
|
|
101
|
+
let totalDeleted = 0;
|
|
102
|
+
const collections = await db.listCollections();
|
|
103
|
+
for (const collection of collections) {
|
|
104
|
+
const snapshot = await collection.get();
|
|
105
|
+
// Delete subcollections first for users collection
|
|
106
|
+
if (collection.id === "users") {
|
|
107
|
+
for (const doc of snapshot.docs) {
|
|
108
|
+
const subcollections = await doc.ref.listCollections();
|
|
109
|
+
for (const subcollection of subcollections) {
|
|
110
|
+
const subSnapshot = await subcollection.get();
|
|
111
|
+
if (!subSnapshot.empty) {
|
|
112
|
+
const batch = db.batch();
|
|
113
|
+
subSnapshot.docs.forEach((subDoc) => batch.delete(subDoc.ref));
|
|
114
|
+
await batch.commit();
|
|
115
|
+
totalDeleted += subSnapshot.docs.length;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
// Delete main collection documents
|
|
121
|
+
if (!snapshot.empty) {
|
|
122
|
+
const batch = db.batch();
|
|
123
|
+
snapshot.docs.forEach((doc) => batch.delete(doc.ref));
|
|
124
|
+
await batch.commit();
|
|
125
|
+
totalDeleted += snapshot.docs.length;
|
|
126
|
+
onProgress?.(collection.id, totalDeleted);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return totalDeleted;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Seed documents in batches
|
|
133
|
+
*/
|
|
134
|
+
async function seedBatch(db, collectionPath, docs) {
|
|
135
|
+
const result = {
|
|
136
|
+
success: true,
|
|
137
|
+
processed: 0,
|
|
138
|
+
errors: [],
|
|
139
|
+
};
|
|
140
|
+
for (let i = 0; i < docs.length; i += BATCH_SIZE) {
|
|
141
|
+
const batch = db.batch();
|
|
142
|
+
const slice = docs.slice(i, i + BATCH_SIZE);
|
|
143
|
+
for (const { id, data } of slice) {
|
|
144
|
+
const ref = db.collection(collectionPath).doc(id);
|
|
145
|
+
const clean = Object.fromEntries(Object.entries(data).filter(([, v]) => v !== undefined));
|
|
146
|
+
batch.set(ref, clean);
|
|
147
|
+
}
|
|
148
|
+
try {
|
|
149
|
+
await batch.commit();
|
|
150
|
+
result.processed += slice.length;
|
|
151
|
+
}
|
|
152
|
+
catch (error) {
|
|
153
|
+
result.success = false;
|
|
154
|
+
result.errors.push(`Batch failed at index ${i}: ${error}`);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
return result;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Seed user subcollection
|
|
161
|
+
*/
|
|
162
|
+
async function seedUserSubcollection(db, userId, subcollectionName, docs) {
|
|
163
|
+
const result = {
|
|
164
|
+
success: true,
|
|
165
|
+
processed: 0,
|
|
166
|
+
errors: [],
|
|
167
|
+
};
|
|
168
|
+
const batch = db.batch();
|
|
169
|
+
for (const { id, data } of docs) {
|
|
170
|
+
const ref = db
|
|
171
|
+
.collection("users")
|
|
172
|
+
.doc(userId)
|
|
173
|
+
.collection(subcollectionName)
|
|
174
|
+
.doc(id);
|
|
175
|
+
const clean = Object.fromEntries(Object.entries(data).filter(([, v]) => v !== undefined));
|
|
176
|
+
batch.set(ref, clean);
|
|
177
|
+
}
|
|
178
|
+
try {
|
|
179
|
+
await batch.commit();
|
|
180
|
+
result.processed = docs.length;
|
|
181
|
+
}
|
|
182
|
+
catch (error) {
|
|
183
|
+
result.success = false;
|
|
184
|
+
result.errors.push(`Failed to seed subcollection: ${error}`);
|
|
185
|
+
}
|
|
186
|
+
return result;
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Count documents in collection
|
|
190
|
+
*/
|
|
191
|
+
async function countDocuments(db, collectionPath) {
|
|
192
|
+
const count = await db.collection(collectionPath).count().get();
|
|
193
|
+
return count.data().count;
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Get user document count statistics
|
|
197
|
+
*/
|
|
198
|
+
async function getUserStats(db) {
|
|
199
|
+
const usersSnapshot = await db.collection("users").get();
|
|
200
|
+
let anonymous = 0;
|
|
201
|
+
let authenticated = 0;
|
|
202
|
+
usersSnapshot.docs.forEach((doc) => {
|
|
203
|
+
const data = doc.data();
|
|
204
|
+
if (data.isAnonymous) {
|
|
205
|
+
anonymous++;
|
|
206
|
+
}
|
|
207
|
+
else {
|
|
208
|
+
authenticated++;
|
|
209
|
+
}
|
|
210
|
+
});
|
|
211
|
+
return {
|
|
212
|
+
total: usersSnapshot.docs.length,
|
|
213
|
+
anonymous,
|
|
214
|
+
authenticated,
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
//# sourceMappingURL=firestore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"firestore.js","sourceRoot":"","sources":["../../scripts/firestore.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Firebase Admin Scripts
|
|
3
|
+
*
|
|
4
|
+
* Generic utilities for Firebase Admin operations.
|
|
5
|
+
* Use these for CLI scripts, seeding, cleanup, and testing.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* import { initFirebaseAdmin, cleanupAnonymousUsers } from "@umituz/react-native-firebase/scripts";
|
|
9
|
+
*
|
|
10
|
+
* const app = initFirebaseAdmin({
|
|
11
|
+
* serviceAccountPath: "./service-account.json",
|
|
12
|
+
* projectId: "my-project",
|
|
13
|
+
* storageBucket: "my-project.appspot.com",
|
|
14
|
+
* });
|
|
15
|
+
*
|
|
16
|
+
* const auth = getAuthAdmin(app);
|
|
17
|
+
* await cleanupAnonymousUsers(auth);
|
|
18
|
+
*/
|
|
19
|
+
export type { FirebaseAdminConfig, CollectionInfo, UserInfo, CleanupResult, BatchResult, StorageFileInfo, ResetSummary, } from "./types";
|
|
20
|
+
export { initFirebaseAdmin, getFirestoreAdmin, getAuthAdmin, getStorageAdmin, resetFirebaseAdmin, } from "./init";
|
|
21
|
+
export { listAllUsers, listAuthenticatedUsers, listAnonymousUsers, deleteUsers, cleanupAnonymousUsers, deleteAllUsers, getUserStats as getAuthUserStats, } from "./auth";
|
|
22
|
+
export { listCollections, listUserSubcollections, deleteCollection, deleteUserSubcollection, deleteAllData, seedBatch, seedUserSubcollection, countDocuments, getUserStats as getFirestoreUserStats, } from "./firestore";
|
|
23
|
+
export { listFiles, deleteAllFiles, deleteFilesByPrefix, getStorageStats, deleteUserFiles, } from "./storage";
|
|
24
|
+
export { randomId, randomDate, randomItem, randomNumber, randomBoolean, sleep, formatBytes, createConfirmationTimer, printSeparator, printHeader, } from "./utils";
|
|
25
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../scripts/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAGH,YAAY,EACV,mBAAmB,EACnB,cAAc,EACd,QAAQ,EACR,aAAa,EACb,WAAW,EACX,eAAe,EACf,YAAY,GACb,MAAM,SAAS,CAAC;AAGjB,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,YAAY,EACZ,eAAe,EACf,kBAAkB,GACnB,MAAM,QAAQ,CAAC;AAGhB,OAAO,EACL,YAAY,EACZ,sBAAsB,EACtB,kBAAkB,EAClB,WAAW,EACX,qBAAqB,EACrB,cAAc,EACd,YAAY,IAAI,gBAAgB,GACjC,MAAM,QAAQ,CAAC;AAGhB,OAAO,EACL,eAAe,EACf,sBAAsB,EACtB,gBAAgB,EAChB,uBAAuB,EACvB,aAAa,EACb,SAAS,EACT,qBAAqB,EACrB,cAAc,EACd,YAAY,IAAI,qBAAqB,GACtC,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,SAAS,EACT,cAAc,EACd,mBAAmB,EACnB,eAAe,EACf,eAAe,GAChB,MAAM,WAAW,CAAC;AAGnB,OAAO,EACL,QAAQ,EACR,UAAU,EACV,UAAU,EACV,YAAY,EACZ,aAAa,EACb,KAAK,EACL,WAAW,EACX,uBAAuB,EACvB,cAAc,EACd,WAAW,GACZ,MAAM,SAAS,CAAC"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Firebase Admin Scripts
|
|
4
|
+
*
|
|
5
|
+
* Generic utilities for Firebase Admin operations.
|
|
6
|
+
* Use these for CLI scripts, seeding, cleanup, and testing.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* import { initFirebaseAdmin, cleanupAnonymousUsers } from "@umituz/react-native-firebase/scripts";
|
|
10
|
+
*
|
|
11
|
+
* const app = initFirebaseAdmin({
|
|
12
|
+
* serviceAccountPath: "./service-account.json",
|
|
13
|
+
* projectId: "my-project",
|
|
14
|
+
* storageBucket: "my-project.appspot.com",
|
|
15
|
+
* });
|
|
16
|
+
*
|
|
17
|
+
* const auth = getAuthAdmin(app);
|
|
18
|
+
* await cleanupAnonymousUsers(auth);
|
|
19
|
+
*/
|
|
20
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
21
|
+
exports.printHeader = exports.printSeparator = exports.createConfirmationTimer = exports.formatBytes = exports.sleep = exports.randomBoolean = exports.randomNumber = exports.randomItem = exports.randomDate = exports.randomId = exports.deleteUserFiles = exports.getStorageStats = exports.deleteFilesByPrefix = exports.deleteAllFiles = exports.listFiles = exports.getFirestoreUserStats = exports.countDocuments = exports.seedUserSubcollection = exports.seedBatch = exports.deleteAllData = exports.deleteUserSubcollection = exports.deleteCollection = exports.listUserSubcollections = exports.listCollections = exports.getAuthUserStats = exports.deleteAllUsers = exports.cleanupAnonymousUsers = exports.deleteUsers = exports.listAnonymousUsers = exports.listAuthenticatedUsers = exports.listAllUsers = exports.resetFirebaseAdmin = exports.getStorageAdmin = exports.getAuthAdmin = exports.getFirestoreAdmin = exports.initFirebaseAdmin = void 0;
|
|
22
|
+
// Initialization
|
|
23
|
+
var init_1 = require("./init");
|
|
24
|
+
Object.defineProperty(exports, "initFirebaseAdmin", { enumerable: true, get: function () { return init_1.initFirebaseAdmin; } });
|
|
25
|
+
Object.defineProperty(exports, "getFirestoreAdmin", { enumerable: true, get: function () { return init_1.getFirestoreAdmin; } });
|
|
26
|
+
Object.defineProperty(exports, "getAuthAdmin", { enumerable: true, get: function () { return init_1.getAuthAdmin; } });
|
|
27
|
+
Object.defineProperty(exports, "getStorageAdmin", { enumerable: true, get: function () { return init_1.getStorageAdmin; } });
|
|
28
|
+
Object.defineProperty(exports, "resetFirebaseAdmin", { enumerable: true, get: function () { return init_1.resetFirebaseAdmin; } });
|
|
29
|
+
// Auth utilities
|
|
30
|
+
var auth_1 = require("./auth");
|
|
31
|
+
Object.defineProperty(exports, "listAllUsers", { enumerable: true, get: function () { return auth_1.listAllUsers; } });
|
|
32
|
+
Object.defineProperty(exports, "listAuthenticatedUsers", { enumerable: true, get: function () { return auth_1.listAuthenticatedUsers; } });
|
|
33
|
+
Object.defineProperty(exports, "listAnonymousUsers", { enumerable: true, get: function () { return auth_1.listAnonymousUsers; } });
|
|
34
|
+
Object.defineProperty(exports, "deleteUsers", { enumerable: true, get: function () { return auth_1.deleteUsers; } });
|
|
35
|
+
Object.defineProperty(exports, "cleanupAnonymousUsers", { enumerable: true, get: function () { return auth_1.cleanupAnonymousUsers; } });
|
|
36
|
+
Object.defineProperty(exports, "deleteAllUsers", { enumerable: true, get: function () { return auth_1.deleteAllUsers; } });
|
|
37
|
+
Object.defineProperty(exports, "getAuthUserStats", { enumerable: true, get: function () { return auth_1.getUserStats; } });
|
|
38
|
+
// Firestore utilities
|
|
39
|
+
var firestore_1 = require("./firestore");
|
|
40
|
+
Object.defineProperty(exports, "listCollections", { enumerable: true, get: function () { return firestore_1.listCollections; } });
|
|
41
|
+
Object.defineProperty(exports, "listUserSubcollections", { enumerable: true, get: function () { return firestore_1.listUserSubcollections; } });
|
|
42
|
+
Object.defineProperty(exports, "deleteCollection", { enumerable: true, get: function () { return firestore_1.deleteCollection; } });
|
|
43
|
+
Object.defineProperty(exports, "deleteUserSubcollection", { enumerable: true, get: function () { return firestore_1.deleteUserSubcollection; } });
|
|
44
|
+
Object.defineProperty(exports, "deleteAllData", { enumerable: true, get: function () { return firestore_1.deleteAllData; } });
|
|
45
|
+
Object.defineProperty(exports, "seedBatch", { enumerable: true, get: function () { return firestore_1.seedBatch; } });
|
|
46
|
+
Object.defineProperty(exports, "seedUserSubcollection", { enumerable: true, get: function () { return firestore_1.seedUserSubcollection; } });
|
|
47
|
+
Object.defineProperty(exports, "countDocuments", { enumerable: true, get: function () { return firestore_1.countDocuments; } });
|
|
48
|
+
Object.defineProperty(exports, "getFirestoreUserStats", { enumerable: true, get: function () { return firestore_1.getUserStats; } });
|
|
49
|
+
// Storage utilities
|
|
50
|
+
var storage_1 = require("./storage");
|
|
51
|
+
Object.defineProperty(exports, "listFiles", { enumerable: true, get: function () { return storage_1.listFiles; } });
|
|
52
|
+
Object.defineProperty(exports, "deleteAllFiles", { enumerable: true, get: function () { return storage_1.deleteAllFiles; } });
|
|
53
|
+
Object.defineProperty(exports, "deleteFilesByPrefix", { enumerable: true, get: function () { return storage_1.deleteFilesByPrefix; } });
|
|
54
|
+
Object.defineProperty(exports, "getStorageStats", { enumerable: true, get: function () { return storage_1.getStorageStats; } });
|
|
55
|
+
Object.defineProperty(exports, "deleteUserFiles", { enumerable: true, get: function () { return storage_1.deleteUserFiles; } });
|
|
56
|
+
// Utility functions
|
|
57
|
+
var utils_1 = require("./utils");
|
|
58
|
+
Object.defineProperty(exports, "randomId", { enumerable: true, get: function () { return utils_1.randomId; } });
|
|
59
|
+
Object.defineProperty(exports, "randomDate", { enumerable: true, get: function () { return utils_1.randomDate; } });
|
|
60
|
+
Object.defineProperty(exports, "randomItem", { enumerable: true, get: function () { return utils_1.randomItem; } });
|
|
61
|
+
Object.defineProperty(exports, "randomNumber", { enumerable: true, get: function () { return utils_1.randomNumber; } });
|
|
62
|
+
Object.defineProperty(exports, "randomBoolean", { enumerable: true, get: function () { return utils_1.randomBoolean; } });
|
|
63
|
+
Object.defineProperty(exports, "sleep", { enumerable: true, get: function () { return utils_1.sleep; } });
|
|
64
|
+
Object.defineProperty(exports, "formatBytes", { enumerable: true, get: function () { return utils_1.formatBytes; } });
|
|
65
|
+
Object.defineProperty(exports, "createConfirmationTimer", { enumerable: true, get: function () { return utils_1.createConfirmationTimer; } });
|
|
66
|
+
Object.defineProperty(exports, "printSeparator", { enumerable: true, get: function () { return utils_1.printSeparator; } });
|
|
67
|
+
Object.defineProperty(exports, "printHeader", { enumerable: true, get: function () { return utils_1.printHeader; } });
|
|
68
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../scripts/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;GAiBG;;;AAaH,iBAAiB;AACjB,+BAMgB;AALd,yGAAA,iBAAiB,OAAA;AACjB,yGAAA,iBAAiB,OAAA;AACjB,oGAAA,YAAY,OAAA;AACZ,uGAAA,eAAe,OAAA;AACf,0GAAA,kBAAkB,OAAA;AAGpB,iBAAiB;AACjB,+BAQgB;AAPd,oGAAA,YAAY,OAAA;AACZ,8GAAA,sBAAsB,OAAA;AACtB,0GAAA,kBAAkB,OAAA;AAClB,mGAAA,WAAW,OAAA;AACX,6GAAA,qBAAqB,OAAA;AACrB,sGAAA,cAAc,OAAA;AACd,wGAAA,YAAY,OAAoB;AAGlC,sBAAsB;AACtB,yCAUqB;AATnB,4GAAA,eAAe,OAAA;AACf,mHAAA,sBAAsB,OAAA;AACtB,6GAAA,gBAAgB,OAAA;AAChB,oHAAA,uBAAuB,OAAA;AACvB,0GAAA,aAAa,OAAA;AACb,sGAAA,SAAS,OAAA;AACT,kHAAA,qBAAqB,OAAA;AACrB,2GAAA,cAAc,OAAA;AACd,kHAAA,YAAY,OAAyB;AAGvC,oBAAoB;AACpB,qCAMmB;AALjB,oGAAA,SAAS,OAAA;AACT,yGAAA,cAAc,OAAA;AACd,8GAAA,mBAAmB,OAAA;AACnB,0GAAA,eAAe,OAAA;AACf,0GAAA,eAAe,OAAA;AAGjB,oBAAoB;AACpB,iCAWiB;AAVf,iGAAA,QAAQ,OAAA;AACR,mGAAA,UAAU,OAAA;AACV,mGAAA,UAAU,OAAA;AACV,qGAAA,YAAY,OAAA;AACZ,sGAAA,aAAa,OAAA;AACb,8FAAA,KAAK,OAAA;AACL,oGAAA,WAAW,OAAA;AACX,gHAAA,uBAAuB,OAAA;AACvB,uGAAA,cAAc,OAAA;AACd,oGAAA,WAAW,OAAA"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Firebase Admin Initialization
|
|
3
|
+
* Dynamic configuration - no hardcoded values
|
|
4
|
+
*/
|
|
5
|
+
import * as admin from "firebase-admin";
|
|
6
|
+
import type { FirebaseAdminConfig } from "./types";
|
|
7
|
+
/**
|
|
8
|
+
* Initialize Firebase Admin SDK with config
|
|
9
|
+
* @param config - Firebase Admin configuration
|
|
10
|
+
* @returns Initialized Firebase Admin app
|
|
11
|
+
*/
|
|
12
|
+
export declare function initFirebaseAdmin(config: FirebaseAdminConfig): admin.app.App;
|
|
13
|
+
/**
|
|
14
|
+
* Get Firestore instance
|
|
15
|
+
*/
|
|
16
|
+
export declare function getFirestoreAdmin(app: admin.app.App): admin.firestore.Firestore;
|
|
17
|
+
/**
|
|
18
|
+
* Get Auth instance
|
|
19
|
+
*/
|
|
20
|
+
export declare function getAuthAdmin(app: admin.app.App): admin.auth.Auth;
|
|
21
|
+
/**
|
|
22
|
+
* Get Storage bucket
|
|
23
|
+
*/
|
|
24
|
+
export declare function getStorageAdmin(app: admin.app.App): admin.storage.Storage;
|
|
25
|
+
/**
|
|
26
|
+
* Reset initialized app (for testing)
|
|
27
|
+
*/
|
|
28
|
+
export declare function resetFirebaseAdmin(): void;
|
|
29
|
+
//# sourceMappingURL=init.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../scripts/init.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,KAAK,MAAM,gBAAgB,CAAC;AACxC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAInD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,mBAAmB,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAiB5E;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,GAAG,KAAK,CAAC,SAAS,CAAC,SAAS,CAE/E;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAEhE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAEzE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CAEzC"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Firebase Admin Initialization
|
|
4
|
+
* Dynamic configuration - no hardcoded values
|
|
5
|
+
*/
|
|
6
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
|
+
if (k2 === undefined) k2 = k;
|
|
8
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
9
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
10
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
11
|
+
}
|
|
12
|
+
Object.defineProperty(o, k2, desc);
|
|
13
|
+
}) : (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
o[k2] = m[k];
|
|
16
|
+
}));
|
|
17
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
18
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
19
|
+
}) : function(o, v) {
|
|
20
|
+
o["default"] = v;
|
|
21
|
+
});
|
|
22
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
23
|
+
var ownKeys = function(o) {
|
|
24
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
25
|
+
var ar = [];
|
|
26
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
27
|
+
return ar;
|
|
28
|
+
};
|
|
29
|
+
return ownKeys(o);
|
|
30
|
+
};
|
|
31
|
+
return function (mod) {
|
|
32
|
+
if (mod && mod.__esModule) return mod;
|
|
33
|
+
var result = {};
|
|
34
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
35
|
+
__setModuleDefault(result, mod);
|
|
36
|
+
return result;
|
|
37
|
+
};
|
|
38
|
+
})();
|
|
39
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
+
exports.initFirebaseAdmin = initFirebaseAdmin;
|
|
41
|
+
exports.getFirestoreAdmin = getFirestoreAdmin;
|
|
42
|
+
exports.getAuthAdmin = getAuthAdmin;
|
|
43
|
+
exports.getStorageAdmin = getStorageAdmin;
|
|
44
|
+
exports.resetFirebaseAdmin = resetFirebaseAdmin;
|
|
45
|
+
const admin = __importStar(require("firebase-admin"));
|
|
46
|
+
let initializedApp = null;
|
|
47
|
+
/**
|
|
48
|
+
* Initialize Firebase Admin SDK with config
|
|
49
|
+
* @param config - Firebase Admin configuration
|
|
50
|
+
* @returns Initialized Firebase Admin app
|
|
51
|
+
*/
|
|
52
|
+
function initFirebaseAdmin(config) {
|
|
53
|
+
if (initializedApp) {
|
|
54
|
+
return initializedApp;
|
|
55
|
+
}
|
|
56
|
+
if (admin.apps.length > 0) {
|
|
57
|
+
initializedApp = admin.apps[0];
|
|
58
|
+
return initializedApp;
|
|
59
|
+
}
|
|
60
|
+
initializedApp = admin.initializeApp({
|
|
61
|
+
credential: admin.credential.cert(config.serviceAccountPath),
|
|
62
|
+
projectId: config.projectId,
|
|
63
|
+
storageBucket: config.storageBucket,
|
|
64
|
+
});
|
|
65
|
+
return initializedApp;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Get Firestore instance
|
|
69
|
+
*/
|
|
70
|
+
function getFirestoreAdmin(app) {
|
|
71
|
+
return admin.firestore(app);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Get Auth instance
|
|
75
|
+
*/
|
|
76
|
+
function getAuthAdmin(app) {
|
|
77
|
+
return admin.auth(app);
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Get Storage bucket
|
|
81
|
+
*/
|
|
82
|
+
function getStorageAdmin(app) {
|
|
83
|
+
return admin.storage(app);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Reset initialized app (for testing)
|
|
87
|
+
*/
|
|
88
|
+
function resetFirebaseAdmin() {
|
|
89
|
+
initializedApp = null;
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../scripts/init.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAYH,8CAiBC;AAKD,8CAEC;AAKD,oCAEC;AAKD,0CAEC;AAKD,gDAEC;AAvDD,sDAAwC;AAGxC,IAAI,cAAc,GAAyB,IAAI,CAAC;AAEhD;;;;GAIG;AACH,SAAgB,iBAAiB,CAAC,MAA2B;IAC3D,IAAI,cAAc,EAAE,CAAC;QACnB,OAAO,cAAc,CAAC;IACxB,CAAC;IAED,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,cAAc,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC;QAChC,OAAO,cAAc,CAAC;IACxB,CAAC;IAED,cAAc,GAAG,KAAK,CAAC,aAAa,CAAC;QACnC,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC;QAC5D,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,aAAa,EAAE,MAAM,CAAC,aAAa;KACpC,CAAC,CAAC;IAEH,OAAO,cAAc,CAAC;AACxB,CAAC;AAED;;GAEG;AACH,SAAgB,iBAAiB,CAAC,GAAkB;IAClD,OAAO,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;AAC9B,CAAC;AAED;;GAEG;AACH,SAAgB,YAAY,CAAC,GAAkB;IAC7C,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACzB,CAAC;AAED;;GAEG;AACH,SAAgB,eAAe,CAAC,GAAkB;IAChD,OAAO,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;AAC5B,CAAC;AAED;;GAEG;AACH,SAAgB,kBAAkB;IAChC,cAAc,GAAG,IAAI,CAAC;AACxB,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Firebase Admin Storage Utilities
|
|
3
|
+
* Generic Storage operations for admin scripts
|
|
4
|
+
*/
|
|
5
|
+
import * as admin from "firebase-admin";
|
|
6
|
+
import type { StorageFileInfo, CleanupResult } from "./types";
|
|
7
|
+
/**
|
|
8
|
+
* List all files in storage bucket
|
|
9
|
+
*/
|
|
10
|
+
export declare function listFiles(storage: admin.storage.Storage, prefix?: string): Promise<StorageFileInfo[]>;
|
|
11
|
+
/**
|
|
12
|
+
* Delete all files in storage
|
|
13
|
+
*/
|
|
14
|
+
export declare function deleteAllFiles(storage: admin.storage.Storage, onProgress?: (deleted: number, total: number) => void): Promise<CleanupResult>;
|
|
15
|
+
/**
|
|
16
|
+
* Delete files by prefix (folder)
|
|
17
|
+
*/
|
|
18
|
+
export declare function deleteFilesByPrefix(storage: admin.storage.Storage, prefix: string, onProgress?: (deleted: number, total: number) => void): Promise<CleanupResult>;
|
|
19
|
+
/**
|
|
20
|
+
* Get storage statistics
|
|
21
|
+
*/
|
|
22
|
+
export declare function getStorageStats(storage: admin.storage.Storage): Promise<{
|
|
23
|
+
totalFiles: number;
|
|
24
|
+
totalSizeBytes: number;
|
|
25
|
+
totalSizeMB: number;
|
|
26
|
+
}>;
|
|
27
|
+
/**
|
|
28
|
+
* Delete user files (files in users/{userId}/ folder)
|
|
29
|
+
*/
|
|
30
|
+
export declare function deleteUserFiles(storage: admin.storage.Storage, userId: string, onProgress?: (deleted: number, total: number) => void): Promise<CleanupResult>;
|
|
31
|
+
//# sourceMappingURL=storage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../scripts/storage.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,KAAK,MAAM,gBAAgB,CAAC;AACxC,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE9D;;GAEG;AACH,wBAAsB,SAAS,CAC7B,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,OAAO,EAC9B,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,eAAe,EAAE,CAAC,CAY5B;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,OAAO,EAC9B,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,GACpD,OAAO,CAAC,aAAa,CAAC,CAsBxB;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,OAAO,EAC9B,MAAM,EAAE,MAAM,EACd,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,GACpD,OAAO,CAAC,aAAa,CAAC,CAsBxB;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,OAAO,GAC7B,OAAO,CAAC;IACT,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC,CASD;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,OAAO,EAC9B,MAAM,EAAE,MAAM,EACd,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,GACpD,OAAO,CAAC,aAAa,CAAC,CAExB"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Firebase Admin Storage Utilities
|
|
4
|
+
* Generic Storage operations for admin scripts
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.listFiles = listFiles;
|
|
8
|
+
exports.deleteAllFiles = deleteAllFiles;
|
|
9
|
+
exports.deleteFilesByPrefix = deleteFilesByPrefix;
|
|
10
|
+
exports.getStorageStats = getStorageStats;
|
|
11
|
+
exports.deleteUserFiles = deleteUserFiles;
|
|
12
|
+
/**
|
|
13
|
+
* List all files in storage bucket
|
|
14
|
+
*/
|
|
15
|
+
async function listFiles(storage, prefix) {
|
|
16
|
+
const bucket = storage.bucket();
|
|
17
|
+
const [files] = await bucket.getFiles({ prefix });
|
|
18
|
+
return files.map((file) => ({
|
|
19
|
+
name: file.name,
|
|
20
|
+
size: parseInt(file.metadata.size, 10) || 0,
|
|
21
|
+
contentType: file.metadata.contentType,
|
|
22
|
+
createdAt: file.metadata.timeCreated
|
|
23
|
+
? new Date(file.metadata.timeCreated)
|
|
24
|
+
: undefined,
|
|
25
|
+
}));
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Delete all files in storage
|
|
29
|
+
*/
|
|
30
|
+
async function deleteAllFiles(storage, onProgress) {
|
|
31
|
+
const bucket = storage.bucket();
|
|
32
|
+
const [files] = await bucket.getFiles();
|
|
33
|
+
const result = {
|
|
34
|
+
totalProcessed: files.length,
|
|
35
|
+
deleted: 0,
|
|
36
|
+
preserved: 0,
|
|
37
|
+
errors: [],
|
|
38
|
+
};
|
|
39
|
+
for (const file of files) {
|
|
40
|
+
try {
|
|
41
|
+
await file.delete();
|
|
42
|
+
result.deleted++;
|
|
43
|
+
onProgress?.(result.deleted, files.length);
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
result.errors.push(`Failed to delete ${file.name}: ${error}`);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return result;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Delete files by prefix (folder)
|
|
53
|
+
*/
|
|
54
|
+
async function deleteFilesByPrefix(storage, prefix, onProgress) {
|
|
55
|
+
const bucket = storage.bucket();
|
|
56
|
+
const [files] = await bucket.getFiles({ prefix });
|
|
57
|
+
const result = {
|
|
58
|
+
totalProcessed: files.length,
|
|
59
|
+
deleted: 0,
|
|
60
|
+
preserved: 0,
|
|
61
|
+
errors: [],
|
|
62
|
+
};
|
|
63
|
+
for (const file of files) {
|
|
64
|
+
try {
|
|
65
|
+
await file.delete();
|
|
66
|
+
result.deleted++;
|
|
67
|
+
onProgress?.(result.deleted, files.length);
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
result.errors.push(`Failed to delete ${file.name}: ${error}`);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return result;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Get storage statistics
|
|
77
|
+
*/
|
|
78
|
+
async function getStorageStats(storage) {
|
|
79
|
+
const files = await listFiles(storage);
|
|
80
|
+
const totalSizeBytes = files.reduce((sum, file) => sum + file.size, 0);
|
|
81
|
+
return {
|
|
82
|
+
totalFiles: files.length,
|
|
83
|
+
totalSizeBytes,
|
|
84
|
+
totalSizeMB: Math.round((totalSizeBytes / (1024 * 1024)) * 100) / 100,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Delete user files (files in users/{userId}/ folder)
|
|
89
|
+
*/
|
|
90
|
+
async function deleteUserFiles(storage, userId, onProgress) {
|
|
91
|
+
return deleteFilesByPrefix(storage, `users/${userId}/`, onProgress);
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../scripts/storage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Firebase Admin Scripts - Shared Types
|
|
3
|
+
* Generic types for Firebase Admin operations
|
|
4
|
+
*/
|
|
5
|
+
export interface FirebaseAdminConfig {
|
|
6
|
+
/** Path to service account JSON file */
|
|
7
|
+
serviceAccountPath: string;
|
|
8
|
+
/** Firebase project ID */
|
|
9
|
+
projectId: string;
|
|
10
|
+
/** Storage bucket name (optional) */
|
|
11
|
+
storageBucket?: string;
|
|
12
|
+
}
|
|
13
|
+
export interface CollectionInfo {
|
|
14
|
+
name: string;
|
|
15
|
+
documentCount: number;
|
|
16
|
+
sampleDocumentId?: string;
|
|
17
|
+
hasSubcollections?: boolean;
|
|
18
|
+
}
|
|
19
|
+
export interface UserInfo {
|
|
20
|
+
uid: string;
|
|
21
|
+
email?: string;
|
|
22
|
+
displayName?: string;
|
|
23
|
+
isAnonymous: boolean;
|
|
24
|
+
createdAt?: Date;
|
|
25
|
+
providerCount: number;
|
|
26
|
+
}
|
|
27
|
+
export interface CleanupResult {
|
|
28
|
+
totalProcessed: number;
|
|
29
|
+
deleted: number;
|
|
30
|
+
preserved: number;
|
|
31
|
+
errors: string[];
|
|
32
|
+
}
|
|
33
|
+
export interface BatchResult {
|
|
34
|
+
success: boolean;
|
|
35
|
+
processed: number;
|
|
36
|
+
errors: string[];
|
|
37
|
+
}
|
|
38
|
+
export interface StorageFileInfo {
|
|
39
|
+
name: string;
|
|
40
|
+
size: number;
|
|
41
|
+
contentType?: string;
|
|
42
|
+
createdAt?: Date;
|
|
43
|
+
}
|
|
44
|
+
export interface ResetSummary {
|
|
45
|
+
authUsersDeleted: number;
|
|
46
|
+
firestoreDocsDeleted: number;
|
|
47
|
+
storageFilesDeleted: number;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../scripts/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,mBAAmB;IAClC,wCAAwC;IACxC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,0BAA0B;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,qCAAqC;IACrC,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,aAAa;IAC5B,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,IAAI,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,gBAAgB,EAAE,MAAM,CAAC;IACzB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,mBAAmB,EAAE,MAAM,CAAC;CAC7B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../scripts/types.ts"],"names":[],"mappings":";AAAA;;;GAGG"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Firebase Admin Scripts - Utility Functions
|
|
3
|
+
* Generic helpers for seeding and testing
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Generate random ID
|
|
7
|
+
*/
|
|
8
|
+
export declare function randomId(): string;
|
|
9
|
+
/**
|
|
10
|
+
* Generate random date within the past N days
|
|
11
|
+
*/
|
|
12
|
+
export declare function randomDate(daysAgo: number): Date;
|
|
13
|
+
/**
|
|
14
|
+
* Get random item from array
|
|
15
|
+
*/
|
|
16
|
+
export declare function randomItem<T>(arr: T[]): T;
|
|
17
|
+
/**
|
|
18
|
+
* Generate random number in range
|
|
19
|
+
*/
|
|
20
|
+
export declare function randomNumber(min: number, max: number): number;
|
|
21
|
+
/**
|
|
22
|
+
* Generate random boolean
|
|
23
|
+
*/
|
|
24
|
+
export declare function randomBoolean(): boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Sleep for specified milliseconds
|
|
27
|
+
*/
|
|
28
|
+
export declare function sleep(ms: number): Promise<void>;
|
|
29
|
+
/**
|
|
30
|
+
* Format bytes to human readable string
|
|
31
|
+
*/
|
|
32
|
+
export declare function formatBytes(bytes: number): string;
|
|
33
|
+
/**
|
|
34
|
+
* Create a confirmation prompt (for CLI scripts)
|
|
35
|
+
*/
|
|
36
|
+
export declare function createConfirmationTimer(seconds: number, warningMessage: string): Promise<void>;
|
|
37
|
+
/**
|
|
38
|
+
* Print separator line
|
|
39
|
+
*/
|
|
40
|
+
export declare function printSeparator(char?: string, length?: number): void;
|
|
41
|
+
/**
|
|
42
|
+
* Print header with separators
|
|
43
|
+
*/
|
|
44
|
+
export declare function printHeader(title: string): void;
|
|
45
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../scripts/utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,wBAAgB,QAAQ,IAAI,MAAM,CAKjC;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAMhD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,CAEzC;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,OAAO,CAEvC;AAED;;GAEG;AACH,wBAAgB,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE/C;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMjD;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,IAAI,CAAC,CAMf;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,SAAM,EAAE,MAAM,SAAK,GAAG,IAAI,CAE5D;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAK/C"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Firebase Admin Scripts - Utility Functions
|
|
4
|
+
* Generic helpers for seeding and testing
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.randomId = randomId;
|
|
8
|
+
exports.randomDate = randomDate;
|
|
9
|
+
exports.randomItem = randomItem;
|
|
10
|
+
exports.randomNumber = randomNumber;
|
|
11
|
+
exports.randomBoolean = randomBoolean;
|
|
12
|
+
exports.sleep = sleep;
|
|
13
|
+
exports.formatBytes = formatBytes;
|
|
14
|
+
exports.createConfirmationTimer = createConfirmationTimer;
|
|
15
|
+
exports.printSeparator = printSeparator;
|
|
16
|
+
exports.printHeader = printHeader;
|
|
17
|
+
/**
|
|
18
|
+
* Generate random ID
|
|
19
|
+
*/
|
|
20
|
+
function randomId() {
|
|
21
|
+
return (Math.random().toString(36).substring(2, 15) +
|
|
22
|
+
Math.random().toString(36).substring(2, 15));
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Generate random date within the past N days
|
|
26
|
+
*/
|
|
27
|
+
function randomDate(daysAgo) {
|
|
28
|
+
const now = new Date();
|
|
29
|
+
const pastDate = new Date(now.getTime() - daysAgo * 24 * 60 * 60 * 1000);
|
|
30
|
+
const randomTime = pastDate.getTime() + Math.random() * (now.getTime() - pastDate.getTime());
|
|
31
|
+
return new Date(randomTime);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Get random item from array
|
|
35
|
+
*/
|
|
36
|
+
function randomItem(arr) {
|
|
37
|
+
return arr[Math.floor(Math.random() * arr.length)];
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Generate random number in range
|
|
41
|
+
*/
|
|
42
|
+
function randomNumber(min, max) {
|
|
43
|
+
return Math.floor(Math.random() * (max - min + 1)) + min;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Generate random boolean
|
|
47
|
+
*/
|
|
48
|
+
function randomBoolean() {
|
|
49
|
+
return Math.random() > 0.5;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Sleep for specified milliseconds
|
|
53
|
+
*/
|
|
54
|
+
function sleep(ms) {
|
|
55
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Format bytes to human readable string
|
|
59
|
+
*/
|
|
60
|
+
function formatBytes(bytes) {
|
|
61
|
+
if (bytes === 0)
|
|
62
|
+
return "0 Bytes";
|
|
63
|
+
const k = 1024;
|
|
64
|
+
const sizes = ["Bytes", "KB", "MB", "GB"];
|
|
65
|
+
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
|
66
|
+
return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + " " + sizes[i];
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Create a confirmation prompt (for CLI scripts)
|
|
70
|
+
*/
|
|
71
|
+
function createConfirmationTimer(seconds, warningMessage) {
|
|
72
|
+
return new Promise((resolve) => {
|
|
73
|
+
console.log(warningMessage);
|
|
74
|
+
console.log(`\nPress Ctrl+C to cancel, or wait ${seconds} seconds to continue...\n`);
|
|
75
|
+
setTimeout(resolve, seconds * 1000);
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Print separator line
|
|
80
|
+
*/
|
|
81
|
+
function printSeparator(char = "=", length = 70) {
|
|
82
|
+
console.log(char.repeat(length));
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Print header with separators
|
|
86
|
+
*/
|
|
87
|
+
function printHeader(title) {
|
|
88
|
+
printSeparator();
|
|
89
|
+
console.log(title);
|
|
90
|
+
printSeparator();
|
|
91
|
+
console.log();
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../scripts/utils.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@umituz/react-native-firebase",
|
|
3
|
-
"version": "1.13.
|
|
3
|
+
"version": "1.13.38",
|
|
4
4
|
"description": "Unified Firebase package for React Native apps - Auth and Firestore services using Firebase JS SDK (no native modules).",
|
|
5
5
|
"main": "./src/index.ts",
|
|
6
6
|
"types": "./src/index.ts",
|
|
7
7
|
"scripts": {
|
|
8
|
+
"build:scripts": "tsc -p tsconfig.scripts.json",
|
|
9
|
+
"prepublishOnly": "npm run build:scripts",
|
|
8
10
|
"typecheck": "echo 'TypeScript validation passed'",
|
|
9
11
|
"lint": "echo 'Lint passed'",
|
|
10
12
|
"version:patch": "npm version patch -m 'chore: release v%s'",
|
|
@@ -49,7 +51,7 @@
|
|
|
49
51
|
"expo-apple-authentication": "^8.0.8",
|
|
50
52
|
"expo-crypto": "^15.0.8",
|
|
51
53
|
"firebase": "^12.6.0",
|
|
52
|
-
"firebase-admin": "^13.0
|
|
54
|
+
"firebase-admin": "^13.6.0",
|
|
53
55
|
"react": "19.1.0",
|
|
54
56
|
"react-native": "0.81.5",
|
|
55
57
|
"typescript": "~5.9.2"
|
|
@@ -63,11 +65,16 @@
|
|
|
63
65
|
"files": [
|
|
64
66
|
"src",
|
|
65
67
|
"scripts",
|
|
68
|
+
"dist/scripts",
|
|
66
69
|
"README.md",
|
|
67
70
|
"LICENSE"
|
|
68
71
|
],
|
|
69
72
|
"exports": {
|
|
70
73
|
".": "./src/index.ts",
|
|
71
|
-
"./scripts":
|
|
74
|
+
"./scripts": {
|
|
75
|
+
"require": "./dist/scripts/index.js",
|
|
76
|
+
"import": "./dist/scripts/index.js",
|
|
77
|
+
"types": "./dist/scripts/index.d.ts"
|
|
78
|
+
}
|
|
72
79
|
}
|
|
73
80
|
}
|