@x12i/catalox 2.3.0 → 2.5.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.
- package/README.md +60 -7
- package/dist/src/catalox/backup-data.d.ts +40 -0
- package/dist/src/catalox/backup-data.d.ts.map +1 -0
- package/dist/src/catalox/backup-data.js +522 -0
- package/dist/src/catalox/backup-data.js.map +1 -0
- package/dist/src/catalox/catalox.d.ts +42 -0
- package/dist/src/catalox/catalox.d.ts.map +1 -1
- package/dist/src/catalox/catalox.js +127 -7
- package/dist/src/catalox/catalox.js.map +1 -1
- package/dist/src/catalox/firestore-gcs-compare.d.ts +15 -0
- package/dist/src/catalox/firestore-gcs-compare.d.ts.map +1 -0
- package/dist/src/catalox/firestore-gcs-compare.js +221 -0
- package/dist/src/catalox/firestore-gcs-compare.js.map +1 -0
- package/dist/src/catalox/firestore-gcs-transfer.d.ts +24 -0
- package/dist/src/catalox/firestore-gcs-transfer.d.ts.map +1 -0
- package/dist/src/catalox/firestore-gcs-transfer.js +346 -0
- package/dist/src/catalox/firestore-gcs-transfer.js.map +1 -0
- package/dist/src/catalox/index.d.ts +5 -0
- package/dist/src/catalox/index.d.ts.map +1 -1
- package/dist/src/catalox/index.js +5 -0
- package/dist/src/catalox/index.js.map +1 -1
- package/dist/src/catalox/native-catalog-layout-diagnostics.d.ts +29 -0
- package/dist/src/catalox/native-catalog-layout-diagnostics.d.ts.map +1 -0
- package/dist/src/catalox/native-catalog-layout-diagnostics.js +55 -0
- package/dist/src/catalox/native-catalog-layout-diagnostics.js.map +1 -0
- package/dist/src/catalox/restore-firestore-backup.d.ts +13 -0
- package/dist/src/catalox/restore-firestore-backup.d.ts.map +1 -0
- package/dist/src/catalox/restore-firestore-backup.js +326 -0
- package/dist/src/catalox/restore-firestore-backup.js.map +1 -0
- package/dist/src/cli/index.js +312 -1
- package/dist/src/cli/index.js.map +1 -1
- package/dist/src/contracts/backup.d.ts +36 -0
- package/dist/src/contracts/backup.d.ts.map +1 -0
- package/dist/src/contracts/backup.js +2 -0
- package/dist/src/contracts/backup.js.map +1 -0
- package/dist/src/contracts/catalog-data-index.d.ts +13 -0
- package/dist/src/contracts/catalog-data-index.d.ts.map +1 -0
- package/dist/src/contracts/catalog-data-index.js +2 -0
- package/dist/src/contracts/catalog-data-index.js.map +1 -0
- package/dist/src/contracts/catalogs.d.ts +8 -1
- package/dist/src/contracts/catalogs.d.ts.map +1 -1
- package/dist/src/contracts/catalogs.js +18 -1
- package/dist/src/contracts/catalogs.js.map +1 -1
- package/dist/src/contracts/gcs-firestore-compare.d.ts +64 -0
- package/dist/src/contracts/gcs-firestore-compare.d.ts.map +1 -0
- package/dist/src/contracts/gcs-firestore-compare.js +2 -0
- package/dist/src/contracts/gcs-firestore-compare.js.map +1 -0
- package/dist/src/contracts/gcs-firestore-transfer.d.ts +94 -0
- package/dist/src/contracts/gcs-firestore-transfer.d.ts.map +1 -0
- package/dist/src/contracts/gcs-firestore-transfer.js +2 -0
- package/dist/src/contracts/gcs-firestore-transfer.js.map +1 -0
- package/dist/src/contracts/index.d.ts +6 -0
- package/dist/src/contracts/index.d.ts.map +1 -1
- package/dist/src/contracts/index.js +1 -0
- package/dist/src/contracts/index.js.map +1 -1
- package/dist/src/contracts/restore.d.ts +44 -0
- package/dist/src/contracts/restore.d.ts.map +1 -0
- package/dist/src/contracts/restore.js +2 -0
- package/dist/src/contracts/restore.js.map +1 -0
- package/dist/src/firebase/catalog-data-index-store.d.ts +14 -0
- package/dist/src/firebase/catalog-data-index-store.d.ts.map +1 -0
- package/dist/src/firebase/catalog-data-index-store.js +33 -0
- package/dist/src/firebase/catalog-data-index-store.js.map +1 -0
- package/dist/src/firebase/catalog-data-paths.d.ts +14 -0
- package/dist/src/firebase/catalog-data-paths.d.ts.map +1 -0
- package/dist/src/firebase/catalog-data-paths.js +31 -0
- package/dist/src/firebase/catalog-data-paths.js.map +1 -0
- package/dist/src/firebase/index.d.ts +2 -0
- package/dist/src/firebase/index.d.ts.map +1 -1
- package/dist/src/firebase/index.js +2 -0
- package/dist/src/firebase/index.js.map +1 -1
- package/dist/src/firebase/native-item-store.d.ts +11 -1
- package/dist/src/firebase/native-item-store.d.ts.map +1 -1
- package/dist/src/firebase/native-item-store.js +51 -16
- package/dist/src/firebase/native-item-store.js.map +1 -1
- package/dist/src/migrations/index.d.ts +1 -0
- package/dist/src/migrations/index.d.ts.map +1 -1
- package/dist/src/migrations/index.js +1 -0
- package/dist/src/migrations/index.js.map +1 -1
- package/dist/src/migrations/migrate-native-catalog-layout.d.ts +51 -0
- package/dist/src/migrations/migrate-native-catalog-layout.d.ts.map +1 -0
- package/dist/src/migrations/migrate-native-catalog-layout.js +224 -0
- package/dist/src/migrations/migrate-native-catalog-layout.js.map +1 -0
- package/dist/test/integration/firestore.emulator.test.js +10 -2
- package/dist/test/integration/firestore.emulator.test.js.map +1 -1
- package/dist/test/unit/backup-timestamp.test.d.ts +2 -0
- package/dist/test/unit/backup-timestamp.test.d.ts.map +1 -0
- package/dist/test/unit/backup-timestamp.test.js +11 -0
- package/dist/test/unit/backup-timestamp.test.js.map +1 -0
- package/dist/test/unit/compact-catalog-filter.test.d.ts +2 -0
- package/dist/test/unit/compact-catalog-filter.test.d.ts.map +1 -0
- package/dist/test/unit/compact-catalog-filter.test.js +18 -0
- package/dist/test/unit/compact-catalog-filter.test.js.map +1 -0
- package/dist/test/unit/gcs-firestore-compare.test.d.ts +2 -0
- package/dist/test/unit/gcs-firestore-compare.test.d.ts.map +1 -0
- package/dist/test/unit/gcs-firestore-compare.test.js +14 -0
- package/dist/test/unit/gcs-firestore-compare.test.js.map +1 -0
- package/dist/test/unit/gcs-firestore-paths.test.d.ts +2 -0
- package/dist/test/unit/gcs-firestore-paths.test.d.ts.map +1 -0
- package/dist/test/unit/gcs-firestore-paths.test.js +16 -0
- package/dist/test/unit/gcs-firestore-paths.test.js.map +1 -0
- package/dist/test/unit/resolve-native-items-layout.test.d.ts +2 -0
- package/dist/test/unit/resolve-native-items-layout.test.d.ts.map +1 -0
- package/dist/test/unit/resolve-native-items-layout.test.js +50 -0
- package/dist/test/unit/resolve-native-items-layout.test.js.map +1 -0
- package/package.json +5 -1
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
export * from "./context.js";
|
|
2
2
|
export * from "./authorization.js";
|
|
3
3
|
export * from "./catalox.js";
|
|
4
|
+
export { runBackupData, formatBackupTimestamp, discoverNativeCatalogIds, BACKUP_METADATA_SOURCE_NAMES, pruneMongoBackupRuns, pruneFirebaseVersionedBackups, paginatedCopyFirestoreToFirestore, deleteAllDocsInFirestoreCollection, firebaseLatestName, firebaseVersionedName, firebaseNativeLogical, firebaseSnapshotLogical, firebaseSnapshotRunLogical, } from "./backup-data.js";
|
|
5
|
+
export { runRestoreFirestoreBackup, runUndoFirestoreRestore } from "./restore-firestore-backup.js";
|
|
6
|
+
export { exportFirestoreCollectionToGcs, exportAllFirestoreCollectionsToGcs, restoreFirestoreCollectionFromGcs, restoreAllFirestoreCollectionsFromGcsManifest, CATALOX_FIRESTORE_GCS_MANIFEST, normalizeGcsPrefix, firestoreCollectionPathToObjectBase, ndjsonObjectPath, collectionRefFromPath, } from "./firestore-gcs-transfer.js";
|
|
7
|
+
export { compareFirestoreCollectionWithGcsNdjson, compareAllFirestoreCollectionsWithGcsManifest, normalizeForCompare, dataFingerprint, } from "./firestore-gcs-compare.js";
|
|
8
|
+
export { reportNativeCatalogLayoutDiagnostics, nativeCatalogFirestorePaths, } from "./native-catalog-layout-diagnostics.js";
|
|
4
9
|
export * from "./identity.js";
|
|
5
10
|
export * from "./json-io.js";
|
|
6
11
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/catalox/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AACnC,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/catalox/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AACnC,cAAc,cAAc,CAAC;AAC7B,OAAO,EACL,aAAa,EACb,qBAAqB,EACrB,wBAAwB,EACxB,4BAA4B,EAE5B,oBAAoB,EACpB,6BAA6B,EAC7B,iCAAiC,EACjC,kCAAkC,EAClC,kBAAkB,EAClB,qBAAqB,EACrB,qBAAqB,EACrB,uBAAuB,EACvB,0BAA0B,GAC3B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,yBAAyB,EAAE,uBAAuB,EAA6B,MAAM,+BAA+B,CAAC;AAC9H,OAAO,EACL,8BAA8B,EAC9B,kCAAkC,EAClC,iCAAiC,EACjC,6CAA6C,EAC7C,8BAA8B,EAC9B,kBAAkB,EAClB,mCAAmC,EACnC,gBAAgB,EAChB,qBAAqB,GACtB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,uCAAuC,EACvC,6CAA6C,EAC7C,mBAAmB,EACnB,eAAe,GAChB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,oCAAoC,EACpC,2BAA2B,GAE5B,MAAM,wCAAwC,CAAC;AAChD,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { CatalogId } from "../contracts/ids.js";
|
|
2
|
+
import { type BackupDataDeps } from "./backup-data.js";
|
|
3
|
+
export type NativeCatalogLayoutDiagnosticRow = {
|
|
4
|
+
catalogId: string;
|
|
5
|
+
/** Documents under `catalogData/{catalogId}/items` (legacy). */
|
|
6
|
+
legacyItemCount: number;
|
|
7
|
+
/** Documents under top-level `catalogData-{catalogId}-items` (flat). */
|
|
8
|
+
flatItemCount: number;
|
|
9
|
+
/** What `NativeItemStore` / backup would use today. */
|
|
10
|
+
resolverLayout: "flat" | "legacy";
|
|
11
|
+
/** True when legacy still holds rows; flat migration (or delete-legacy) is what removes this from being authoritative. */
|
|
12
|
+
legacyHasRows: boolean;
|
|
13
|
+
/** True when legacy has rows and flat is empty — run `migrateNativeCatalogLayout` to create flat rows. */
|
|
14
|
+
needsLegacyToFlatMigration: boolean;
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Inspect native storage paths for every discovered catalog (same discovery rules as backup/migrate).
|
|
18
|
+
* Use this when the Firebase console still shows **`catalogData/{catalogId}/items`** (legacy) and you expect **`catalogData-{catalogId}-items`** at the root.
|
|
19
|
+
*/
|
|
20
|
+
export declare function reportNativeCatalogLayoutDiagnostics(deps: BackupDataDeps, opts?: {
|
|
21
|
+
catalogIds?: CatalogId[];
|
|
22
|
+
appId?: string;
|
|
23
|
+
}): Promise<NativeCatalogLayoutDiagnosticRow[]>;
|
|
24
|
+
/** Human-readable live paths for one catalog (for CLI / operators). */
|
|
25
|
+
export declare function nativeCatalogFirestorePaths(catalogId: string): {
|
|
26
|
+
legacyItemsPath: string;
|
|
27
|
+
flatItemsCollectionId: string;
|
|
28
|
+
};
|
|
29
|
+
//# sourceMappingURL=native-catalog-layout-diagnostics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"native-catalog-layout-diagnostics.d.ts","sourceRoot":"","sources":["../../../src/catalox/native-catalog-layout-diagnostics.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAErD,OAAO,EAA4B,KAAK,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAsBjF,MAAM,MAAM,gCAAgC,GAAG;IAC7C,SAAS,EAAE,MAAM,CAAC;IAClB,gEAAgE;IAChE,eAAe,EAAE,MAAM,CAAC;IACxB,wEAAwE;IACxE,aAAa,EAAE,MAAM,CAAC;IACtB,uDAAuD;IACvD,cAAc,EAAE,MAAM,GAAG,QAAQ,CAAC;IAClC,0HAA0H;IAC1H,aAAa,EAAE,OAAO,CAAC;IACvB,0GAA0G;IAC1G,0BAA0B,EAAE,OAAO,CAAC;CACrC,CAAC;AAEF;;;GAGG;AACH,wBAAsB,oCAAoC,CACxD,IAAI,EAAE,cAAc,EACpB,IAAI,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,SAAS,EAAE,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAClD,OAAO,CAAC,gCAAgC,EAAE,CAAC,CAyB7C;AAED,uEAAuE;AACvE,wBAAgB,2BAA2B,CAAC,SAAS,EAAE,MAAM,GAAG;IAC9D,eAAe,EAAE,MAAM,CAAC;IACxB,qBAAqB,EAAE,MAAM,CAAC;CAC/B,CAKA"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { FieldPath } from "firebase-admin/firestore";
|
|
2
|
+
import { discoverNativeCatalogIds } from "./backup-data.js";
|
|
3
|
+
import { flatNativeItemsCollectionRef, legacyNativeItemsCollectionRef, resolveNativeItemsLayout, nativeItemsCollectionId, } from "../firebase/catalog-data-paths.js";
|
|
4
|
+
async function countDocs(col) {
|
|
5
|
+
let n = 0;
|
|
6
|
+
let last;
|
|
7
|
+
while (true) {
|
|
8
|
+
let q = col.orderBy(FieldPath.documentId()).limit(500);
|
|
9
|
+
if (last)
|
|
10
|
+
q = q.startAfter(last);
|
|
11
|
+
const snap = await q.get();
|
|
12
|
+
if (snap.empty)
|
|
13
|
+
break;
|
|
14
|
+
n += snap.size;
|
|
15
|
+
last = snap.docs[snap.docs.length - 1];
|
|
16
|
+
}
|
|
17
|
+
return n;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Inspect native storage paths for every discovered catalog (same discovery rules as backup/migrate).
|
|
21
|
+
* Use this when the Firebase console still shows **`catalogData/{catalogId}/items`** (legacy) and you expect **`catalogData-{catalogId}-items`** at the root.
|
|
22
|
+
*/
|
|
23
|
+
export async function reportNativeCatalogLayoutDiagnostics(deps, opts) {
|
|
24
|
+
const fs = deps.firestoreStore.firestore;
|
|
25
|
+
const allCatalogs = await deps.catalogs.listAll();
|
|
26
|
+
const ids = await discoverNativeCatalogIds(fs, allCatalogs, {
|
|
27
|
+
bindings: deps.bindings,
|
|
28
|
+
...(opts?.catalogIds?.length ? { catalogIds: opts.catalogIds } : {}),
|
|
29
|
+
...(opts?.appId != null && opts.appId !== "" ? { appId: opts.appId } : {}),
|
|
30
|
+
});
|
|
31
|
+
const rows = [];
|
|
32
|
+
for (const catalogId of ids) {
|
|
33
|
+
const leg = legacyNativeItemsCollectionRef(fs, catalogId);
|
|
34
|
+
const flat = flatNativeItemsCollectionRef(fs, catalogId);
|
|
35
|
+
const [legacyItemCount, flatItemCount] = await Promise.all([countDocs(leg), countDocs(flat)]);
|
|
36
|
+
const resolverLayout = await resolveNativeItemsLayout(fs, catalogId);
|
|
37
|
+
rows.push({
|
|
38
|
+
catalogId: String(catalogId),
|
|
39
|
+
legacyItemCount,
|
|
40
|
+
flatItemCount,
|
|
41
|
+
resolverLayout,
|
|
42
|
+
legacyHasRows: legacyItemCount > 0,
|
|
43
|
+
needsLegacyToFlatMigration: legacyItemCount > 0 && flatItemCount === 0,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
return rows;
|
|
47
|
+
}
|
|
48
|
+
/** Human-readable live paths for one catalog (for CLI / operators). */
|
|
49
|
+
export function nativeCatalogFirestorePaths(catalogId) {
|
|
50
|
+
return {
|
|
51
|
+
legacyItemsPath: `catalogData/${catalogId}/items`,
|
|
52
|
+
flatItemsCollectionId: nativeItemsCollectionId(catalogId),
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=native-catalog-layout-diagnostics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"native-catalog-layout-diagnostics.js","sourceRoot":"","sources":["../../../src/catalox/native-catalog-layout-diagnostics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAkB,MAAM,0BAA0B,CAAC;AAIrE,OAAO,EAAE,wBAAwB,EAAuB,MAAM,kBAAkB,CAAC;AACjF,OAAO,EACL,4BAA4B,EAC5B,8BAA8B,EAC9B,wBAAwB,EACxB,uBAAuB,GACxB,MAAM,mCAAmC,CAAC;AAE3C,KAAK,UAAU,SAAS,CAAC,GAA0C;IACjE,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,IAAI,IAAyD,CAAC;IAC9D,OAAO,IAAI,EAAE,CAAC;QACZ,IAAI,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACvD,IAAI,IAAI;YAAE,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACjC,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC;QAC3B,IAAI,IAAI,CAAC,KAAK;YAAE,MAAM;QACtB,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC;QACf,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACzC,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAgBD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,oCAAoC,CACxD,IAAoB,EACpB,IAAmD;IAEnD,MAAM,EAAE,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC;IACzC,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;IAClD,MAAM,GAAG,GAAG,MAAM,wBAAwB,CAAC,EAAE,EAAE,WAA8B,EAAE;QAC7E,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,GAAG,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACpE,GAAG,CAAC,IAAI,EAAE,KAAK,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC3E,CAAC,CAAC;IAEH,MAAM,IAAI,GAAuC,EAAE,CAAC;IACpD,KAAK,MAAM,SAAS,IAAI,GAAG,EAAE,CAAC;QAC5B,MAAM,GAAG,GAAG,8BAA8B,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;QAC1D,MAAM,IAAI,GAAG,4BAA4B,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;QACzD,MAAM,CAAC,eAAe,EAAE,aAAa,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC9F,MAAM,cAAc,GAAG,MAAM,wBAAwB,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;QACrE,IAAI,CAAC,IAAI,CAAC;YACR,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC;YAC5B,eAAe;YACf,aAAa;YACb,cAAc;YACd,aAAa,EAAE,eAAe,GAAG,CAAC;YAClC,0BAA0B,EAAE,eAAe,GAAG,CAAC,IAAI,aAAa,KAAK,CAAC;SACvE,CAAC,CAAC;IACL,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,2BAA2B,CAAC,SAAiB;IAI3D,OAAO;QACL,eAAe,EAAE,eAAe,SAAS,QAAQ;QACjD,qBAAqB,EAAE,uBAAuB,CAAC,SAAS,CAAC;KAC1D,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { RestoreFirestoreBackupInput, RestoreFirestoreBackupResult, UndoFirestoreRestoreInput, UndoFirestoreRestoreResult } from "../contracts/restore.js";
|
|
2
|
+
import type { BackupDataDeps } from "./backup-data.js";
|
|
3
|
+
import { NativeItemStore } from "../firebase/native-item-store.js";
|
|
4
|
+
import { DefinitionStore } from "../firebase/definition-store.js";
|
|
5
|
+
import { CatalogDataIndexStore } from "../firebase/catalog-data-index-store.js";
|
|
6
|
+
export type RestoreFirestoreDeps = BackupDataDeps & {
|
|
7
|
+
nativeItems: NativeItemStore;
|
|
8
|
+
definitions: DefinitionStore;
|
|
9
|
+
catalogDataIndex: CatalogDataIndexStore;
|
|
10
|
+
};
|
|
11
|
+
export declare function runRestoreFirestoreBackup(deps: RestoreFirestoreDeps, input: RestoreFirestoreBackupInput): Promise<RestoreFirestoreBackupResult>;
|
|
12
|
+
export declare function runUndoFirestoreRestore(deps: RestoreFirestoreDeps, input: UndoFirestoreRestoreInput): Promise<UndoFirestoreRestoreResult>;
|
|
13
|
+
//# sourceMappingURL=restore-firestore-backup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"restore-firestore-backup.d.ts","sourceRoot":"","sources":["../../../src/catalox/restore-firestore-backup.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,2BAA2B,EAE3B,4BAA4B,EAE5B,yBAAyB,EAEzB,0BAA0B,EAC3B,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAavD,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,qBAAqB,EAAE,MAAM,yCAAyC,CAAC;AAUhF,MAAM,MAAM,oBAAoB,GAAG,cAAc,GAAG;IAClD,WAAW,EAAE,eAAe,CAAC;IAC7B,WAAW,EAAE,eAAe,CAAC;IAC7B,gBAAgB,EAAE,qBAAqB,CAAC;CACzC,CAAC;AAqFF,wBAAsB,yBAAyB,CAC7C,IAAI,EAAE,oBAAoB,EAC1B,KAAK,EAAE,2BAA2B,GACjC,OAAO,CAAC,4BAA4B,CAAC,CA0LvC;AAED,wBAAsB,uBAAuB,CAC3C,IAAI,EAAE,oBAAoB,EAC1B,KAAK,EAAE,yBAAyB,GAC/B,OAAO,CAAC,0BAA0B,CAAC,CAwFrC"}
|
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
import { BACKUP_METADATA_SOURCE_NAMES, deleteAllDocsInFirestoreCollection, discoverNativeCatalogIds, firebaseNativeLogical, firebaseSnapshotLogical, firebaseSnapshotRunLogical, firebaseVersionedName, formatBackupTimestamp, paginatedCopyFirestoreToFirestore, firebaseLatestName, } from "./backup-data.js";
|
|
2
|
+
import { NativeItemStore } from "../firebase/native-item-store.js";
|
|
3
|
+
import { DefinitionStore } from "../firebase/definition-store.js";
|
|
4
|
+
import { CatalogDataIndexStore } from "../firebase/catalog-data-index-store.js";
|
|
5
|
+
import { legacyNativeItemsCollectionRef, resolveNativeItemsLayout, nativeItemsCollectionId, } from "../firebase/catalog-data-paths.js";
|
|
6
|
+
import { fixNativeCatalogDataMetadata } from "../migrations/migrate-native-catalog-layout.js";
|
|
7
|
+
const RESTORE_MANIFEST_COLLECTION = "backup-restoreSessions";
|
|
8
|
+
function sourceBackupCollectionId(source, logical) {
|
|
9
|
+
if (source.kind === "latest")
|
|
10
|
+
return firebaseLatestName(logical);
|
|
11
|
+
return firebaseVersionedName(source.versionTimestamp, logical);
|
|
12
|
+
}
|
|
13
|
+
function preRestoreCollectionId(restoreSessionId, logical) {
|
|
14
|
+
return `${restoreSessionId}__preRestore-${logical}`;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Discover snapshot backup mirrors by scanning top-level collection ids.
|
|
18
|
+
* Parses `catalogSnapshotsRun--{catalogId}--{runId}` with the last `--` as delimiter (catalogId / runId must not contain `--`).
|
|
19
|
+
*/
|
|
20
|
+
async function listSnapshotRestoreWork(fs, source, includeSnapshots) {
|
|
21
|
+
if (!includeSnapshots)
|
|
22
|
+
return { snapshotCatalogIds: [], snapshotRuns: [] };
|
|
23
|
+
const cols = await fs.listCollections();
|
|
24
|
+
const itemPrefix = source.kind === "latest" ? "backup-catalogSnapshots--" : `${source.versionTimestamp}__backup-catalogSnapshots--`;
|
|
25
|
+
const runPrefix = source.kind === "latest"
|
|
26
|
+
? "backup-catalogSnapshotsRun--"
|
|
27
|
+
: `${source.versionTimestamp}__backup-catalogSnapshotsRun--`;
|
|
28
|
+
const snapshotCatalogIds = new Set();
|
|
29
|
+
const snapshotRuns = [];
|
|
30
|
+
for (const c of cols) {
|
|
31
|
+
const id = c.id;
|
|
32
|
+
if (!id.startsWith(itemPrefix) || id.includes("catalogSnapshotsRun"))
|
|
33
|
+
continue;
|
|
34
|
+
const catalogId = id.slice(itemPrefix.length);
|
|
35
|
+
if (!catalogId)
|
|
36
|
+
continue;
|
|
37
|
+
const probe = await fs.collection(id).limit(1).get();
|
|
38
|
+
if (!probe.empty)
|
|
39
|
+
snapshotCatalogIds.add(catalogId);
|
|
40
|
+
}
|
|
41
|
+
const runSeen = new Set();
|
|
42
|
+
for (const c of cols) {
|
|
43
|
+
const id = c.id;
|
|
44
|
+
if (!id.startsWith(runPrefix))
|
|
45
|
+
continue;
|
|
46
|
+
const rest = id.slice(runPrefix.length);
|
|
47
|
+
const delim = rest.lastIndexOf("--");
|
|
48
|
+
if (delim === -1)
|
|
49
|
+
continue;
|
|
50
|
+
const catalogId = rest.slice(0, delim);
|
|
51
|
+
const runId = rest.slice(delim + 2);
|
|
52
|
+
const probe = await fs.collection(id).limit(1).get();
|
|
53
|
+
if (probe.empty)
|
|
54
|
+
continue;
|
|
55
|
+
const rk = `${catalogId}\0${runId}`;
|
|
56
|
+
if (runSeen.has(rk))
|
|
57
|
+
continue;
|
|
58
|
+
runSeen.add(rk);
|
|
59
|
+
snapshotRuns.push({ catalogId, runId });
|
|
60
|
+
}
|
|
61
|
+
return { snapshotCatalogIds: [...snapshotCatalogIds], snapshotRuns };
|
|
62
|
+
}
|
|
63
|
+
async function writeManifest(fs, manifest) {
|
|
64
|
+
await fs.collection(RESTORE_MANIFEST_COLLECTION).doc(manifest.restoreSessionId).set(manifest, { merge: true });
|
|
65
|
+
}
|
|
66
|
+
async function readManifest(fs, restoreSessionId) {
|
|
67
|
+
const snap = await fs.collection(RESTORE_MANIFEST_COLLECTION).doc(restoreSessionId).get();
|
|
68
|
+
if (!snap.exists)
|
|
69
|
+
return null;
|
|
70
|
+
return snap.data();
|
|
71
|
+
}
|
|
72
|
+
export async function runRestoreFirestoreBackup(deps, input) {
|
|
73
|
+
const issues = [];
|
|
74
|
+
const counts = {};
|
|
75
|
+
const nativeItemSourceLayoutByCatalogId = {};
|
|
76
|
+
if (input.source.kind === "versioned" && !input.source.versionTimestamp?.trim()) {
|
|
77
|
+
return {
|
|
78
|
+
ok: false,
|
|
79
|
+
restoreSessionId: "",
|
|
80
|
+
counts: {},
|
|
81
|
+
issues: [{ code: "missing_version_timestamp", message: "versioned restore requires versionTimestamp" }],
|
|
82
|
+
nativeItemSourceLayoutByCatalogId: {},
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
const fs = deps.firestoreStore.firestore;
|
|
86
|
+
const restoreSessionId = (input.restoreSessionId?.trim() && input.restoreSessionId) || formatBackupTimestamp();
|
|
87
|
+
const includeSnapshots = Boolean(input.includeSnapshots);
|
|
88
|
+
const allCatalogs = await deps.catalogs.listAll();
|
|
89
|
+
const nativeCatalogIds = await discoverNativeCatalogIds(fs, allCatalogs, {
|
|
90
|
+
bindings: deps.bindings,
|
|
91
|
+
...(input.catalogIds != null && input.catalogIds.length ? { catalogIds: input.catalogIds } : {}),
|
|
92
|
+
...(input.appId != null && input.appId !== "" ? { appId: input.appId } : {}),
|
|
93
|
+
});
|
|
94
|
+
const probeLogical = BACKUP_METADATA_SOURCE_NAMES[0];
|
|
95
|
+
const probeId = sourceBackupCollectionId(input.source, probeLogical);
|
|
96
|
+
const probeSnap = await fs.collection(probeId).limit(1).get();
|
|
97
|
+
if (probeSnap.empty) {
|
|
98
|
+
return {
|
|
99
|
+
ok: false,
|
|
100
|
+
restoreSessionId,
|
|
101
|
+
counts,
|
|
102
|
+
issues: [
|
|
103
|
+
{
|
|
104
|
+
code: "backup_source_empty",
|
|
105
|
+
message: `No documents in backup collection ${probeId}; nothing to restore from this source`,
|
|
106
|
+
detail: { probeId },
|
|
107
|
+
},
|
|
108
|
+
],
|
|
109
|
+
nativeItemSourceLayoutByCatalogId: {},
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
const { snapshotCatalogIds, snapshotRuns } = await listSnapshotRestoreWork(fs, input.source, includeSnapshots);
|
|
113
|
+
try {
|
|
114
|
+
for (const name of BACKUP_METADATA_SOURCE_NAMES) {
|
|
115
|
+
const destPre = preRestoreCollectionId(restoreSessionId, name);
|
|
116
|
+
await deleteAllDocsInFirestoreCollection(fs, destPre);
|
|
117
|
+
await paginatedCopyFirestoreToFirestore(fs, name, destPre, counts, `pre:${destPre}`);
|
|
118
|
+
}
|
|
119
|
+
for (const catalogId of nativeCatalogIds) {
|
|
120
|
+
const layout = await resolveNativeItemsLayout(fs, catalogId);
|
|
121
|
+
nativeItemSourceLayoutByCatalogId[String(catalogId)] = layout;
|
|
122
|
+
const logical = firebaseNativeLogical(String(catalogId));
|
|
123
|
+
const destPre = preRestoreCollectionId(restoreSessionId, logical);
|
|
124
|
+
await deleteAllDocsInFirestoreCollection(fs, destPre);
|
|
125
|
+
const livePath = layout === "legacy"
|
|
126
|
+
? legacyNativeItemsCollectionRef(fs, catalogId).path
|
|
127
|
+
: fs.collection(nativeItemsCollectionId(String(catalogId))).path;
|
|
128
|
+
await paginatedCopyFirestoreToFirestore(fs, livePath, destPre, counts, `pre:${destPre}`);
|
|
129
|
+
}
|
|
130
|
+
if (includeSnapshots) {
|
|
131
|
+
for (const catalogId of snapshotCatalogIds) {
|
|
132
|
+
const logical = firebaseSnapshotLogical(catalogId);
|
|
133
|
+
const destPre = preRestoreCollectionId(restoreSessionId, logical);
|
|
134
|
+
await deleteAllDocsInFirestoreCollection(fs, destPre);
|
|
135
|
+
const liveItems = fs.collection("catalogSnapshots").doc(catalogId).collection("items").path;
|
|
136
|
+
await paginatedCopyFirestoreToFirestore(fs, liveItems, destPre, counts, `pre:${destPre}`);
|
|
137
|
+
}
|
|
138
|
+
for (const { catalogId, runId } of snapshotRuns) {
|
|
139
|
+
const logical = firebaseSnapshotRunLogical(catalogId, runId);
|
|
140
|
+
const destPre = preRestoreCollectionId(restoreSessionId, logical);
|
|
141
|
+
await deleteAllDocsInFirestoreCollection(fs, destPre);
|
|
142
|
+
const livePath = fs.collection("catalogSnapshots").doc(catalogId).collection("runs").doc(runId).collection("items")
|
|
143
|
+
.path;
|
|
144
|
+
await paginatedCopyFirestoreToFirestore(fs, livePath, destPre, counts, `pre:${destPre}`);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
const manifest = {
|
|
148
|
+
restoreSessionId,
|
|
149
|
+
createdAt: new Date().toISOString(),
|
|
150
|
+
source: input.source,
|
|
151
|
+
includeSnapshots,
|
|
152
|
+
phase: "preRestoreCaptured",
|
|
153
|
+
nativeCatalogIds: nativeCatalogIds.map(String),
|
|
154
|
+
nativeItemSourceLayoutByCatalogId: { ...nativeItemSourceLayoutByCatalogId },
|
|
155
|
+
metadataSourceNames: BACKUP_METADATA_SOURCE_NAMES,
|
|
156
|
+
snapshotCatalogIds,
|
|
157
|
+
snapshotRuns,
|
|
158
|
+
};
|
|
159
|
+
await writeManifest(fs, manifest);
|
|
160
|
+
for (const name of BACKUP_METADATA_SOURCE_NAMES) {
|
|
161
|
+
const src = sourceBackupCollectionId(input.source, name);
|
|
162
|
+
await deleteAllDocsInFirestoreCollection(fs, name);
|
|
163
|
+
await paginatedCopyFirestoreToFirestore(fs, src, name, counts, `restore:${name}`);
|
|
164
|
+
}
|
|
165
|
+
for (const catalogId of nativeCatalogIds) {
|
|
166
|
+
const cid = String(catalogId);
|
|
167
|
+
const flatPath = nativeItemsCollectionId(cid);
|
|
168
|
+
await deleteAllDocsInFirestoreCollection(fs, flatPath);
|
|
169
|
+
const src = sourceBackupCollectionId(input.source, firebaseNativeLogical(cid));
|
|
170
|
+
await paginatedCopyFirestoreToFirestore(fs, src, flatPath, counts, `restore:nativeFlat:${cid}`);
|
|
171
|
+
const legacyPath = legacyNativeItemsCollectionRef(fs, catalogId).path;
|
|
172
|
+
await deleteAllDocsInFirestoreCollection(fs, legacyPath);
|
|
173
|
+
}
|
|
174
|
+
const nowIso = new Date().toISOString();
|
|
175
|
+
if (nativeCatalogIds.length > 0) {
|
|
176
|
+
await fixNativeCatalogDataMetadata({
|
|
177
|
+
definitions: deps.definitions,
|
|
178
|
+
catalogDataIndex: deps.catalogDataIndex,
|
|
179
|
+
nativeItems: deps.nativeItems,
|
|
180
|
+
}, nativeCatalogIds, nowIso);
|
|
181
|
+
}
|
|
182
|
+
if (includeSnapshots) {
|
|
183
|
+
for (const catalogId of snapshotCatalogIds) {
|
|
184
|
+
const dest = fs.collection("catalogSnapshots").doc(catalogId).collection("items").path;
|
|
185
|
+
const src = sourceBackupCollectionId(input.source, firebaseSnapshotLogical(catalogId));
|
|
186
|
+
await deleteAllDocsInFirestoreCollection(fs, dest);
|
|
187
|
+
await paginatedCopyFirestoreToFirestore(fs, src, dest, counts, `restore:snap:${catalogId}`);
|
|
188
|
+
}
|
|
189
|
+
for (const { catalogId, runId } of snapshotRuns) {
|
|
190
|
+
const dest = fs
|
|
191
|
+
.collection("catalogSnapshots")
|
|
192
|
+
.doc(catalogId)
|
|
193
|
+
.collection("runs")
|
|
194
|
+
.doc(runId)
|
|
195
|
+
.collection("items").path;
|
|
196
|
+
const src = sourceBackupCollectionId(input.source, firebaseSnapshotRunLogical(catalogId, runId));
|
|
197
|
+
await deleteAllDocsInFirestoreCollection(fs, dest);
|
|
198
|
+
await paginatedCopyFirestoreToFirestore(fs, src, dest, counts, `restore:snaprun:${catalogId}:${runId}`);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
await writeManifest(fs, { ...manifest, phase: "restored" });
|
|
202
|
+
deps.nativeItems.invalidateLayoutCache();
|
|
203
|
+
return {
|
|
204
|
+
ok: true,
|
|
205
|
+
restoreSessionId,
|
|
206
|
+
counts,
|
|
207
|
+
issues,
|
|
208
|
+
nativeItemSourceLayoutByCatalogId,
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
catch (e) {
|
|
212
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
213
|
+
issues.push({ code: "restore_failed", message: msg });
|
|
214
|
+
try {
|
|
215
|
+
await writeManifest(fs, {
|
|
216
|
+
restoreSessionId,
|
|
217
|
+
createdAt: new Date().toISOString(),
|
|
218
|
+
source: input.source,
|
|
219
|
+
includeSnapshots,
|
|
220
|
+
phase: "failed",
|
|
221
|
+
nativeCatalogIds: nativeCatalogIds.map(String),
|
|
222
|
+
nativeItemSourceLayoutByCatalogId: { ...nativeItemSourceLayoutByCatalogId },
|
|
223
|
+
metadataSourceNames: BACKUP_METADATA_SOURCE_NAMES,
|
|
224
|
+
snapshotCatalogIds,
|
|
225
|
+
snapshotRuns,
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
catch {
|
|
229
|
+
// ignore manifest write errors during failure handling
|
|
230
|
+
}
|
|
231
|
+
deps.nativeItems.invalidateLayoutCache();
|
|
232
|
+
return {
|
|
233
|
+
ok: false,
|
|
234
|
+
restoreSessionId,
|
|
235
|
+
counts,
|
|
236
|
+
issues,
|
|
237
|
+
nativeItemSourceLayoutByCatalogId,
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
export async function runUndoFirestoreRestore(deps, input) {
|
|
242
|
+
const issues = [];
|
|
243
|
+
const counts = {};
|
|
244
|
+
const fs = deps.firestoreStore.firestore;
|
|
245
|
+
const id = input.restoreSessionId.trim();
|
|
246
|
+
if (!id) {
|
|
247
|
+
return { ok: false, counts, issues: [{ code: "missing_session", message: "restoreSessionId is required" }] };
|
|
248
|
+
}
|
|
249
|
+
const manifest = await readManifest(fs, id);
|
|
250
|
+
if (!manifest) {
|
|
251
|
+
return {
|
|
252
|
+
ok: false,
|
|
253
|
+
counts,
|
|
254
|
+
issues: [{ code: "manifest_not_found", message: `No restore manifest at ${RESTORE_MANIFEST_COLLECTION}/${id}` }],
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
if (manifest.phase === "undone") {
|
|
258
|
+
return { ok: false, counts, issues: [{ code: "already_undone", message: "This restore session was already undone" }] };
|
|
259
|
+
}
|
|
260
|
+
if (manifest.phase !== "restored") {
|
|
261
|
+
return {
|
|
262
|
+
ok: false,
|
|
263
|
+
counts,
|
|
264
|
+
issues: [
|
|
265
|
+
{
|
|
266
|
+
code: "invalid_phase",
|
|
267
|
+
message: `Undo requires phase "restored" (current: ${manifest.phase})`,
|
|
268
|
+
},
|
|
269
|
+
],
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
try {
|
|
273
|
+
if (manifest.includeSnapshots) {
|
|
274
|
+
for (const { catalogId, runId } of manifest.snapshotRuns) {
|
|
275
|
+
const logical = firebaseSnapshotRunLogical(catalogId, runId);
|
|
276
|
+
const src = preRestoreCollectionId(id, logical);
|
|
277
|
+
const dest = fs
|
|
278
|
+
.collection("catalogSnapshots")
|
|
279
|
+
.doc(catalogId)
|
|
280
|
+
.collection("runs")
|
|
281
|
+
.doc(runId)
|
|
282
|
+
.collection("items").path;
|
|
283
|
+
await deleteAllDocsInFirestoreCollection(fs, dest);
|
|
284
|
+
await paginatedCopyFirestoreToFirestore(fs, src, dest, counts, `undo:snaprun:${catalogId}:${runId}`);
|
|
285
|
+
}
|
|
286
|
+
for (const catalogId of manifest.snapshotCatalogIds) {
|
|
287
|
+
const logical = firebaseSnapshotLogical(catalogId);
|
|
288
|
+
const src = preRestoreCollectionId(id, logical);
|
|
289
|
+
const dest = fs.collection("catalogSnapshots").doc(catalogId).collection("items").path;
|
|
290
|
+
await deleteAllDocsInFirestoreCollection(fs, dest);
|
|
291
|
+
await paginatedCopyFirestoreToFirestore(fs, src, dest, counts, `undo:snap:${catalogId}`);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
for (const catalogId of manifest.nativeCatalogIds) {
|
|
295
|
+
const layout = manifest.nativeItemSourceLayoutByCatalogId[catalogId] ?? "flat";
|
|
296
|
+
const cid = catalogId;
|
|
297
|
+
const flatPath = nativeItemsCollectionId(catalogId);
|
|
298
|
+
const legacyPath = legacyNativeItemsCollectionRef(fs, cid).path;
|
|
299
|
+
const src = preRestoreCollectionId(id, firebaseNativeLogical(catalogId));
|
|
300
|
+
if (layout === "legacy") {
|
|
301
|
+
await deleteAllDocsInFirestoreCollection(fs, flatPath);
|
|
302
|
+
await deleteAllDocsInFirestoreCollection(fs, legacyPath);
|
|
303
|
+
await paginatedCopyFirestoreToFirestore(fs, src, legacyPath, counts, `undo:native:${catalogId}`);
|
|
304
|
+
}
|
|
305
|
+
else {
|
|
306
|
+
await deleteAllDocsInFirestoreCollection(fs, flatPath);
|
|
307
|
+
await deleteAllDocsInFirestoreCollection(fs, legacyPath);
|
|
308
|
+
await paginatedCopyFirestoreToFirestore(fs, src, flatPath, counts, `undo:native:${catalogId}`);
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
for (const name of manifest.metadataSourceNames) {
|
|
312
|
+
const src = preRestoreCollectionId(id, name);
|
|
313
|
+
await deleteAllDocsInFirestoreCollection(fs, name);
|
|
314
|
+
await paginatedCopyFirestoreToFirestore(fs, src, name, counts, `undo:${name}`);
|
|
315
|
+
}
|
|
316
|
+
await writeManifest(fs, { ...manifest, phase: "undone" });
|
|
317
|
+
deps.nativeItems.invalidateLayoutCache();
|
|
318
|
+
return { ok: true, counts, issues };
|
|
319
|
+
}
|
|
320
|
+
catch (e) {
|
|
321
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
322
|
+
issues.push({ code: "undo_failed", message: msg });
|
|
323
|
+
return { ok: false, counts, issues };
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
//# sourceMappingURL=restore-firestore-backup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"restore-firestore-backup.js","sourceRoot":"","sources":["../../../src/catalox/restore-firestore-backup.ts"],"names":[],"mappings":"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"}
|