@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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gcs-firestore-compare.js","sourceRoot":"","sources":["../../../src/contracts/gcs-firestore-compare.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import type { Firestore } from "firebase-admin/firestore";
|
|
2
|
+
export type FirestoreGcsTransferBase = {
|
|
3
|
+
bucket: string;
|
|
4
|
+
/** Object key prefix (e.g. `exports/2026-04-18/`). Trailing slash optional. */
|
|
5
|
+
gcsPrefix?: string;
|
|
6
|
+
/**
|
|
7
|
+
* Suffix inserted before `.ndjson` in object names, e.g. `_v1` → `apps_v1.ndjson`.
|
|
8
|
+
* Omit or use empty string for names like `apps.ndjson`.
|
|
9
|
+
*/
|
|
10
|
+
objectNamePostfix?: string;
|
|
11
|
+
};
|
|
12
|
+
export type ExportFirestoreCollectionToGcsInput = FirestoreGcsTransferBase & {
|
|
13
|
+
firestore: Firestore;
|
|
14
|
+
/** Odd-length slash path: top-level `apps` or nested `catalogData/myId/items`. */
|
|
15
|
+
collectionPath: string;
|
|
16
|
+
};
|
|
17
|
+
export type ExportFirestoreCollectionToGcsResult = {
|
|
18
|
+
ok: boolean;
|
|
19
|
+
bucket: string;
|
|
20
|
+
objectPath: string;
|
|
21
|
+
documentCount: number;
|
|
22
|
+
issues: FirestoreGcsTransferIssue[];
|
|
23
|
+
};
|
|
24
|
+
export type ExportAllFirestoreCollectionsToGcsInput = FirestoreGcsTransferBase & {
|
|
25
|
+
firestore: Firestore;
|
|
26
|
+
/**
|
|
27
|
+
* When false (default), only **root** collections are exported.
|
|
28
|
+
* When true, walks every document and enqueues **subcollections** (can be slow and costly).
|
|
29
|
+
*/
|
|
30
|
+
recursive?: boolean;
|
|
31
|
+
};
|
|
32
|
+
export type ExportAllFirestoreCollectionsToGcsResult = {
|
|
33
|
+
ok: boolean;
|
|
34
|
+
bucket: string;
|
|
35
|
+
manifestObjectPath: string;
|
|
36
|
+
entries: Array<{
|
|
37
|
+
firestorePath: string;
|
|
38
|
+
objectPath: string;
|
|
39
|
+
documentCount: number;
|
|
40
|
+
}>;
|
|
41
|
+
issues: FirestoreGcsTransferIssue[];
|
|
42
|
+
};
|
|
43
|
+
export type RestoreFirestoreCollectionFromGcsInput = FirestoreGcsTransferBase & {
|
|
44
|
+
firestore: Firestore;
|
|
45
|
+
/** NDJSON object path **within the bucket** (may include `gcsPrefix`). */
|
|
46
|
+
objectPath: string;
|
|
47
|
+
/** Target collection path (same rules as export `collectionPath`). */
|
|
48
|
+
collectionPath: string;
|
|
49
|
+
/** When true, deletes all documents in the destination collection before import. */
|
|
50
|
+
replaceDestinationCollection?: boolean;
|
|
51
|
+
};
|
|
52
|
+
export type RestoreFirestoreCollectionFromGcsResult = {
|
|
53
|
+
ok: boolean;
|
|
54
|
+
bucket: string;
|
|
55
|
+
objectPath: string;
|
|
56
|
+
collectionPath: string;
|
|
57
|
+
documentsWritten: number;
|
|
58
|
+
issues: FirestoreGcsTransferIssue[];
|
|
59
|
+
};
|
|
60
|
+
export type RestoreAllFirestoreCollectionsFromGcsInput = FirestoreGcsTransferBase & {
|
|
61
|
+
firestore: Firestore;
|
|
62
|
+
/** Manifest object path within bucket (default if omitted: `{gcsPrefix}catalox-firestore-export-manifest.json`). */
|
|
63
|
+
manifestObjectPath?: string;
|
|
64
|
+
replaceDestinationCollection?: boolean;
|
|
65
|
+
};
|
|
66
|
+
export type RestoreAllFirestoreCollectionsFromGcsResult = {
|
|
67
|
+
ok: boolean;
|
|
68
|
+
bucket: string;
|
|
69
|
+
manifestObjectPath: string;
|
|
70
|
+
restored: Array<{
|
|
71
|
+
firestorePath: string;
|
|
72
|
+
objectPath: string;
|
|
73
|
+
documentsWritten: number;
|
|
74
|
+
}>;
|
|
75
|
+
issues: FirestoreGcsTransferIssue[];
|
|
76
|
+
};
|
|
77
|
+
export type FirestoreGcsExportManifestV1 = {
|
|
78
|
+
catalog: "catalox-firestore-gcs-export";
|
|
79
|
+
version: 1;
|
|
80
|
+
exportedAt: string;
|
|
81
|
+
gcsPrefix: string;
|
|
82
|
+
objectNamePostfix: string;
|
|
83
|
+
entries: Array<{
|
|
84
|
+
firestorePath: string;
|
|
85
|
+
objectPath: string;
|
|
86
|
+
documentCount: number;
|
|
87
|
+
}>;
|
|
88
|
+
};
|
|
89
|
+
export type FirestoreGcsTransferIssue = {
|
|
90
|
+
code: string;
|
|
91
|
+
message: string;
|
|
92
|
+
detail?: Record<string, unknown>;
|
|
93
|
+
};
|
|
94
|
+
//# sourceMappingURL=gcs-firestore-transfer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gcs-firestore-transfer.d.ts","sourceRoot":"","sources":["../../../src/contracts/gcs-firestore-transfer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gcs-firestore-transfer.js","sourceRoot":"","sources":["../../../src/contracts/gcs-firestore-transfer.ts"],"names":[],"mappings":""}
|
|
@@ -2,6 +2,7 @@ export type { AppId, StoreId, CatalogId, BindingId, AdapterId, MappingId, ItemId
|
|
|
2
2
|
export type { CatalogSourceMode, CatalogMappedSourceType, CatalogDefinition, CatalogQueryOptions, CatalogListResult, } from "./catalogs.js";
|
|
3
3
|
export type { AppRecord } from "./apps.js";
|
|
4
4
|
export type { CatalogRecord, NativeCatalogConfig } from "./catalogs.js";
|
|
5
|
+
export { compactCatalogFilter } from "./catalogs.js";
|
|
5
6
|
export type { CatalogBindingRecord, BindCatalogInput } from "./bindings.js";
|
|
6
7
|
export type { MongoDatabaseResolution, MongoCatalogAdapterConfig, ApiCatalogAdapterConfig, } from "./adapters.js";
|
|
7
8
|
export type { CatalogFieldMappingSpec, MappingExecutionOptions, MappingExecutionResult, CatalogMappingIssue, CatalogMappingRecord, } from "./mappings.js";
|
|
@@ -29,5 +30,10 @@ export type { StoreRecord, StoreAppBindingRecord } from "./stores.js";
|
|
|
29
30
|
export type { ExportInventoryInput, ExportInventoryData } from "./inventory-export.js";
|
|
30
31
|
export type { InventoryReportInput, InventoryReportData } from "./inventory-report.js";
|
|
31
32
|
export type { CatalogSnapshotRunRecord } from "./snapshots.js";
|
|
33
|
+
export type { BackupMode, BackupDataInput, BackupDataResult, BackupDataIssue, } from "./backup.js";
|
|
34
|
+
export type { RestoreFirestoreBackupSource, RestoreFirestoreBackupInput, RestoreFirestoreBackupResult, RestoreFirestoreBackupIssue, UndoFirestoreRestoreInput, UndoFirestoreRestoreResult, UndoFirestoreRestoreIssue, } from "./restore.js";
|
|
35
|
+
export type { FirestoreGcsTransferBase, ExportFirestoreCollectionToGcsInput, ExportFirestoreCollectionToGcsResult, ExportAllFirestoreCollectionsToGcsInput, ExportAllFirestoreCollectionsToGcsResult, RestoreFirestoreCollectionFromGcsInput, RestoreFirestoreCollectionFromGcsResult, RestoreAllFirestoreCollectionsFromGcsInput, RestoreAllFirestoreCollectionsFromGcsResult, FirestoreGcsExportManifestV1, FirestoreGcsTransferIssue, } from "./gcs-firestore-transfer.js";
|
|
36
|
+
export type { CompareFirestoreCollectionWithGcsInput, CompareFirestoreCollectionWithGcsResult, CompareAllFirestoreCollectionsWithGcsManifestInput, CompareAllFirestoreCollectionsWithGcsResult, CompareIdBuckets, CompareChangedSample, } from "./gcs-firestore-compare.js";
|
|
37
|
+
export type { CatalogDataIndexRecord, CatalogDataLeafIndex } from "./catalog-data-index.js";
|
|
32
38
|
export { CataloxError, CatalogManagerError, CatalogNotFoundError, CatalogAccessDeniedError, CatalogBindingError, CatalogValidationError, CatalogAdapterError, CatalogSyncError, AppNotFoundError, AppPrivilegeError, } from "./errors.js";
|
|
33
39
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/contracts/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/contracts/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAEnG,YAAY,EACV,iBAAiB,EACjB,uBAAuB,EACvB,iBAAiB,EACjB,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,eAAe,CAAC;AAEvB,YAAY,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAC3C,YAAY,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACxE,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,YAAY,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAE5E,YAAY,EACV,uBAAuB,EACvB,yBAAyB,EACzB,uBAAuB,GACxB,MAAM,eAAe,CAAC;AAEvB,YAAY,EACV,uBAAuB,EACvB,uBAAuB,EACvB,sBAAsB,EACtB,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,eAAe,CAAC;AAEvB,YAAY,EACV,kBAAkB,EAClB,uBAAuB,EACvB,yBAAyB,GAC1B,MAAM,YAAY,CAAC;AAEpB,YAAY,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAElD,YAAY,EACV,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,aAAa,CAAC;AAErB,YAAY,EACV,sBAAsB,EACtB,uBAAuB,EACvB,qBAAqB,GACtB,MAAM,iBAAiB,CAAC;AAEzB,YAAY,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACvE,YAAY,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAE1E,YAAY,EACV,iBAAiB,EACjB,uBAAuB,EACvB,sBAAsB,EACtB,yBAAyB,EACzB,6BAA6B,GAC9B,MAAM,kBAAkB,CAAC;AAE1B,YAAY,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAE3D,YAAY,EAAE,WAAW,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAE7E,YAAY,EACV,iBAAiB,EACjB,kBAAkB,EAClB,uBAAuB,EACvB,wBAAwB,EACxB,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,cAAc,CAAC;AAEtB,YAAY,EACV,uBAAuB,EACvB,qBAAqB,EACrB,aAAa,EACb,0BAA0B,EAC1B,iBAAiB,EACjB,eAAe,EACf,kBAAkB,EAClB,aAAa,EACb,uBAAuB,EACvB,QAAQ,EACR,cAAc,EACd,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,OAAO,EACP,WAAW,EACX,kBAAkB,EAClB,gBAAgB,EAChB,cAAc,GACf,MAAM,mBAAmB,CAAC;AAE3B,YAAY,EACV,qBAAqB,EACrB,mBAAmB,EACnB,oBAAoB,EACpB,qBAAqB,EACrB,oBAAoB,EACpB,wBAAwB,EACxB,yBAAyB,EACzB,oBAAoB,GACrB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAE1E,YAAY,EACV,mBAAmB,EACnB,mBAAmB,EACnB,qBAAqB,EACrB,qBAAqB,EACrB,4BAA4B,GAC7B,MAAM,wBAAwB,CAAC;AAEhC,YAAY,EACV,aAAa,EACb,sBAAsB,EACtB,sBAAsB,EACtB,kCAAkC,EAClC,kCAAkC,EAClC,6BAA6B,EAC7B,6BAA6B,GAC9B,MAAM,mBAAmB,CAAC;AAE3B,YAAY,EACV,WAAW,EACX,WAAW,EACX,0BAA0B,EAC1B,uBAAuB,GACxB,MAAM,kBAAkB,CAAC;AAE1B,YAAY,EACV,oBAAoB,EACpB,eAAe,GAChB,MAAM,gBAAgB,CAAC;AAExB,YAAY,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAE1D,YAAY,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAE5D,YAAY,EACV,0BAA0B,EAC1B,2BAA2B,GAC5B,MAAM,sBAAsB,CAAC;AAE9B,YAAY,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAEtE,YAAY,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACvF,YAAY,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAEvF,YAAY,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAE/D,YAAY,EACV,UAAU,EACV,eAAe,EACf,gBAAgB,EAChB,eAAe,GAChB,MAAM,aAAa,CAAC;AAErB,YAAY,EACV,4BAA4B,EAC5B,2BAA2B,EAC3B,4BAA4B,EAC5B,2BAA2B,EAC3B,yBAAyB,EACzB,0BAA0B,EAC1B,yBAAyB,GAC1B,MAAM,cAAc,CAAC;AAEtB,YAAY,EACV,wBAAwB,EACxB,mCAAmC,EACnC,oCAAoC,EACpC,uCAAuC,EACvC,wCAAwC,EACxC,sCAAsC,EACtC,uCAAuC,EACvC,0CAA0C,EAC1C,2CAA2C,EAC3C,4BAA4B,EAC5B,yBAAyB,GAC1B,MAAM,6BAA6B,CAAC;AAErC,YAAY,EACV,sCAAsC,EACtC,uCAAuC,EACvC,kDAAkD,EAClD,2CAA2C,EAC3C,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,4BAA4B,CAAC;AAEpC,YAAY,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAE5F,OAAO,EACL,YAAY,EACZ,mBAAmB,EACnB,oBAAoB,EACpB,wBAAwB,EACxB,mBAAmB,EACnB,sBAAsB,EACtB,mBAAmB,EACnB,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,aAAa,CAAC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
export { compactCatalogFilter } from "./catalogs.js";
|
|
1
2
|
export { resolveCustomRendererEntry } from "./custom-renderer-resolve.js";
|
|
2
3
|
export { CataloxError, CatalogManagerError, CatalogNotFoundError, CatalogAccessDeniedError, CatalogBindingError, CatalogValidationError, CatalogAdapterError, CatalogSyncError, AppNotFoundError, AppPrivilegeError, } from "./errors.js";
|
|
3
4
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/contracts/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/contracts/index.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AA6FrD,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AA0F1E,OAAO,EACL,YAAY,EACZ,mBAAmB,EACnB,oBAAoB,EACpB,wBAAwB,EACxB,mBAAmB,EACnB,sBAAsB,EACtB,mBAAmB,EACnB,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { AppId, CatalogId } from "./ids.js";
|
|
2
|
+
export type RestoreFirestoreBackupSource = {
|
|
3
|
+
kind: "latest";
|
|
4
|
+
} | {
|
|
5
|
+
kind: "versioned";
|
|
6
|
+
versionTimestamp: string;
|
|
7
|
+
};
|
|
8
|
+
export type RestoreFirestoreBackupInput = {
|
|
9
|
+
/** Which backup mirror set to read from (same database, Firebase mode only). */
|
|
10
|
+
source: RestoreFirestoreBackupSource;
|
|
11
|
+
includeSnapshots?: boolean;
|
|
12
|
+
catalogIds?: CatalogId[];
|
|
13
|
+
appId?: AppId;
|
|
14
|
+
/** Optional fixed id for pre-restore / manifest (tests); otherwise a new filesystem-safe timestamp is generated. */
|
|
15
|
+
restoreSessionId?: string;
|
|
16
|
+
};
|
|
17
|
+
export type RestoreFirestoreBackupIssue = {
|
|
18
|
+
code: string;
|
|
19
|
+
message: string;
|
|
20
|
+
detail?: Record<string, unknown>;
|
|
21
|
+
};
|
|
22
|
+
export type RestoreFirestoreBackupResult = {
|
|
23
|
+
ok: boolean;
|
|
24
|
+
/** Prefix used for `restoreSessionId__preRestore-*` collections and the manifest document id. */
|
|
25
|
+
restoreSessionId: string;
|
|
26
|
+
counts: Record<string, number>;
|
|
27
|
+
issues: RestoreFirestoreBackupIssue[];
|
|
28
|
+
/** Native layout per catalog immediately before restore (used by undo). */
|
|
29
|
+
nativeItemSourceLayoutByCatalogId: Record<string, "flat" | "legacy">;
|
|
30
|
+
};
|
|
31
|
+
export type UndoFirestoreRestoreInput = {
|
|
32
|
+
restoreSessionId: string;
|
|
33
|
+
};
|
|
34
|
+
export type UndoFirestoreRestoreIssue = {
|
|
35
|
+
code: string;
|
|
36
|
+
message: string;
|
|
37
|
+
detail?: Record<string, unknown>;
|
|
38
|
+
};
|
|
39
|
+
export type UndoFirestoreRestoreResult = {
|
|
40
|
+
ok: boolean;
|
|
41
|
+
counts: Record<string, number>;
|
|
42
|
+
issues: UndoFirestoreRestoreIssue[];
|
|
43
|
+
};
|
|
44
|
+
//# sourceMappingURL=restore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"restore.d.ts","sourceRoot":"","sources":["../../../src/contracts/restore.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAEjD,MAAM,MAAM,4BAA4B,GACpC;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAClB;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpD,MAAM,MAAM,2BAA2B,GAAG;IACxC,gFAAgF;IAChF,MAAM,EAAE,4BAA4B,CAAC;IACrC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,UAAU,CAAC,EAAE,SAAS,EAAE,CAAC;IACzB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,oHAAoH;IACpH,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC,CAAC;AAEF,MAAM,MAAM,4BAA4B,GAAG;IACzC,EAAE,EAAE,OAAO,CAAC;IACZ,iGAAiG;IACjG,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,MAAM,EAAE,2BAA2B,EAAE,CAAC;IACtC,2EAA2E;IAC3E,iCAAiC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,CAAC,CAAC;CACtE,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,gBAAgB,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG;IACvC,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,MAAM,EAAE,yBAAyB,EAAE,CAAC;CACrC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"restore.js","sourceRoot":"","sources":["../../../src/contracts/restore.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { CatalogId } from "../contracts/ids.js";
|
|
2
|
+
import type { CatalogDataIndexRecord } from "../contracts/catalog-data-index.js";
|
|
3
|
+
import { FirestoreStore } from "./firestore-store.js";
|
|
4
|
+
export declare class CatalogDataIndexStore {
|
|
5
|
+
private readonly store;
|
|
6
|
+
constructor(store: FirestoreStore);
|
|
7
|
+
private docRef;
|
|
8
|
+
get(catalogId: CatalogId): Promise<CatalogDataIndexRecord | null>;
|
|
9
|
+
upsert(record: CatalogDataIndexRecord): Promise<void>;
|
|
10
|
+
merge(catalogId: CatalogId, patch: Partial<CatalogDataIndexRecord>): Promise<void>;
|
|
11
|
+
/** Seed index doc for a native catalog (no item payloads). */
|
|
12
|
+
seedNativeCatalog(catalogId: CatalogId, nowIso: string): Promise<void>;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=catalog-data-index-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog-data-index-store.d.ts","sourceRoot":"","sources":["../../../src/firebase/catalog-data-index-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAC;AACjF,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,qBAAa,qBAAqB;IACpB,OAAO,CAAC,QAAQ,CAAC,KAAK;gBAAL,KAAK,EAAE,cAAc;IAElD,OAAO,CAAC,MAAM;IAIR,GAAG,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,sBAAsB,GAAG,IAAI,CAAC;IAKjE,MAAM,CAAC,MAAM,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrD,KAAK,CAAC,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,CAAC,sBAAsB,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAIxF,8DAA8D;IACxD,iBAAiB,CAAC,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAW7E"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { FirestoreStore } from "./firestore-store.js";
|
|
2
|
+
export class CatalogDataIndexStore {
|
|
3
|
+
store;
|
|
4
|
+
constructor(store) {
|
|
5
|
+
this.store = store;
|
|
6
|
+
}
|
|
7
|
+
docRef(catalogId) {
|
|
8
|
+
return this.store.collection("catalogData").doc(String(catalogId));
|
|
9
|
+
}
|
|
10
|
+
async get(catalogId) {
|
|
11
|
+
const snap = await this.docRef(catalogId).get();
|
|
12
|
+
return snap.exists ? snap.data() : null;
|
|
13
|
+
}
|
|
14
|
+
async upsert(record) {
|
|
15
|
+
await this.docRef(record.catalogId).set(record, { merge: true });
|
|
16
|
+
}
|
|
17
|
+
async merge(catalogId, patch) {
|
|
18
|
+
await this.docRef(catalogId).set(patch, { merge: true });
|
|
19
|
+
}
|
|
20
|
+
/** Seed index doc for a native catalog (no item payloads). */
|
|
21
|
+
async seedNativeCatalog(catalogId, nowIso) {
|
|
22
|
+
const existing = await this.get(catalogId);
|
|
23
|
+
await this.upsert({
|
|
24
|
+
catalogId,
|
|
25
|
+
schemaVersion: "1",
|
|
26
|
+
leaves: { ...(existing?.leaves ?? {}), items: { kind: "primary" } },
|
|
27
|
+
...(existing?.metadata != null ? { metadata: existing.metadata } : {}),
|
|
28
|
+
createdAt: existing?.createdAt ?? nowIso,
|
|
29
|
+
updatedAt: nowIso,
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=catalog-data-index-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog-data-index-store.js","sourceRoot":"","sources":["../../../src/firebase/catalog-data-index-store.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,MAAM,OAAO,qBAAqB;IACH;IAA7B,YAA6B,KAAqB;QAArB,UAAK,GAAL,KAAK,CAAgB;IAAG,CAAC;IAE9C,MAAM,CAAC,SAAoB;QACjC,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;IACrE,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,SAAoB;QAC5B,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE,CAAC;QAChD,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAE,IAAI,CAAC,IAAI,EAA6B,CAAC,CAAC,CAAC,IAAI,CAAC;IACtE,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,MAA8B;QACzC,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACnE,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,SAAoB,EAAE,KAAsC;QACtE,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,KAA+B,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACrF,CAAC;IAED,8DAA8D;IAC9D,KAAK,CAAC,iBAAiB,CAAC,SAAoB,EAAE,MAAc;QAC1D,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC3C,MAAM,IAAI,CAAC,MAAM,CAAC;YAChB,SAAS;YACT,aAAa,EAAE,GAAG;YAClB,MAAM,EAAE,EAAE,GAAG,CAAC,QAAQ,EAAE,MAAM,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE;YACnE,GAAG,CAAC,QAAQ,EAAE,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACtE,SAAS,EAAE,QAAQ,EAAE,SAAS,IAAI,MAAM;YACxC,SAAS,EAAE,MAAM;SAClB,CAAC,CAAC;IACL,CAAC;CACF"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Firestore } from "firebase-admin/firestore";
|
|
2
|
+
import type { CatalogId } from "../contracts/ids.js";
|
|
3
|
+
/** Primary native item rows: top-level collection `catalogData-{catalogId}-items`. */
|
|
4
|
+
export declare function nativeItemsCollectionId(catalogId: CatalogId): string;
|
|
5
|
+
export type NativeItemsLayout = "legacy" | "flat";
|
|
6
|
+
/**
|
|
7
|
+
* Prefer the flat layout when it already has data (post-migration).
|
|
8
|
+
* Otherwise use legacy `catalogData/{catalogId}/items` when it has data.
|
|
9
|
+
* If both are empty, default to flat for new writes.
|
|
10
|
+
*/
|
|
11
|
+
export declare function resolveNativeItemsLayout(firestore: Firestore, catalogId: CatalogId): Promise<NativeItemsLayout>;
|
|
12
|
+
export declare function legacyNativeItemsCollectionRef(firestore: Firestore, catalogId: CatalogId): FirebaseFirestore.CollectionReference<FirebaseFirestore.DocumentData, FirebaseFirestore.DocumentData>;
|
|
13
|
+
export declare function flatNativeItemsCollectionRef(firestore: Firestore, catalogId: CatalogId): FirebaseFirestore.CollectionReference<FirebaseFirestore.DocumentData, FirebaseFirestore.DocumentData>;
|
|
14
|
+
//# sourceMappingURL=catalog-data-paths.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog-data-paths.d.ts","sourceRoot":"","sources":["../../../src/firebase/catalog-data-paths.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAErD,sFAAsF;AACtF,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,SAAS,GAAG,MAAM,CAIpE;AAED,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,MAAM,CAAC;AAElD;;;;GAIG;AACH,wBAAsB,wBAAwB,CAC5C,SAAS,EAAE,SAAS,EACpB,SAAS,EAAE,SAAS,GACnB,OAAO,CAAC,iBAAiB,CAAC,CAW5B;AAED,wBAAgB,8BAA8B,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,yGAExF;AAED,wBAAgB,4BAA4B,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,yGAEtF"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/** Primary native item rows: top-level collection `catalogData-{catalogId}-items`. */
|
|
2
|
+
export function nativeItemsCollectionId(catalogId) {
|
|
3
|
+
const id = String(catalogId).trim();
|
|
4
|
+
if (!id)
|
|
5
|
+
throw new Error("nativeItemsCollectionId: empty catalogId");
|
|
6
|
+
return `catalogData-${id}-items`;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Prefer the flat layout when it already has data (post-migration).
|
|
10
|
+
* Otherwise use legacy `catalogData/{catalogId}/items` when it has data.
|
|
11
|
+
* If both are empty, default to flat for new writes.
|
|
12
|
+
*/
|
|
13
|
+
export async function resolveNativeItemsLayout(firestore, catalogId) {
|
|
14
|
+
const cid = String(catalogId);
|
|
15
|
+
const flat = firestore.collection(nativeItemsCollectionId(cid));
|
|
16
|
+
const flatSnap = await flat.limit(1).get();
|
|
17
|
+
if (!flatSnap.empty)
|
|
18
|
+
return "flat";
|
|
19
|
+
const legacy = firestore.collection("catalogData").doc(cid).collection("items");
|
|
20
|
+
const legSnap = await legacy.limit(1).get();
|
|
21
|
+
if (!legSnap.empty)
|
|
22
|
+
return "legacy";
|
|
23
|
+
return "flat";
|
|
24
|
+
}
|
|
25
|
+
export function legacyNativeItemsCollectionRef(firestore, catalogId) {
|
|
26
|
+
return firestore.collection("catalogData").doc(String(catalogId)).collection("items");
|
|
27
|
+
}
|
|
28
|
+
export function flatNativeItemsCollectionRef(firestore, catalogId) {
|
|
29
|
+
return firestore.collection(nativeItemsCollectionId(catalogId));
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=catalog-data-paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog-data-paths.js","sourceRoot":"","sources":["../../../src/firebase/catalog-data-paths.ts"],"names":[],"mappings":"AAGA,sFAAsF;AACtF,MAAM,UAAU,uBAAuB,CAAC,SAAoB;IAC1D,MAAM,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC;IACpC,IAAI,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IACrE,OAAO,eAAe,EAAE,QAAQ,CAAC;AACnC,CAAC;AAID;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,SAAoB,EACpB,SAAoB;IAEpB,MAAM,GAAG,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;IAC9B,MAAM,IAAI,GAAG,SAAS,CAAC,UAAU,CAAC,uBAAuB,CAAC,GAAG,CAAC,CAAC,CAAC;IAChE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;IAC3C,IAAI,CAAC,QAAQ,CAAC,KAAK;QAAE,OAAO,MAAM,CAAC;IAEnC,MAAM,MAAM,GAAG,SAAS,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IAChF,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;IAC5C,IAAI,CAAC,OAAO,CAAC,KAAK;QAAE,OAAO,QAAQ,CAAC;IAEpC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,8BAA8B,CAAC,SAAoB,EAAE,SAAoB;IACvF,OAAO,SAAS,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;AACxF,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,SAAoB,EAAE,SAAoB;IACrF,OAAO,SAAS,CAAC,UAAU,CAAC,uBAAuB,CAAC,SAAS,CAAC,CAAC,CAAC;AAClE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/firebase/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AACpC,cAAc,8BAA8B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/firebase/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AACpC,cAAc,8BAA8B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/firebase/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AACpC,cAAc,8BAA8B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/firebase/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AACpC,cAAc,8BAA8B,CAAC"}
|
|
@@ -4,12 +4,22 @@ import { FirestoreStore } from "./firestore-store.js";
|
|
|
4
4
|
export type NativeCatalogStoredRecord = NativeCatalogItemRecord;
|
|
5
5
|
export declare class NativeItemStore {
|
|
6
6
|
private readonly store;
|
|
7
|
+
private layoutCache;
|
|
7
8
|
constructor(store: FirestoreStore);
|
|
8
|
-
private
|
|
9
|
+
private layoutPromise;
|
|
10
|
+
/** Invalidate cached layout for a catalog (e.g. after migration). */
|
|
11
|
+
invalidateLayoutCache(catalogId?: CatalogId): void;
|
|
12
|
+
private itemsCollectionRef;
|
|
9
13
|
get(catalogId: CatalogId, itemId: ItemId): Promise<NativeCatalogStoredRecord | null>;
|
|
10
14
|
upsert(catalogId: CatalogId, record: NativeCatalogStoredRecord): Promise<void>;
|
|
11
15
|
delete(catalogId: CatalogId, itemId: ItemId): Promise<void>;
|
|
12
16
|
batchUpsert(catalogId: CatalogId, records: NativeCatalogStoredRecord[]): Promise<void>;
|
|
17
|
+
private executeListQuery;
|
|
18
|
+
/**
|
|
19
|
+
* Lists native rows. If the process cached a legacy vs flat layout choice and data moved
|
|
20
|
+
* (for example after a console migration), the first unconstrained empty page triggers a
|
|
21
|
+
* one-time re-resolve and a second query.
|
|
22
|
+
*/
|
|
13
23
|
list(catalogId: CatalogId, options?: {
|
|
14
24
|
limit?: number;
|
|
15
25
|
offset?: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"native-item-store.d.ts","sourceRoot":"","sources":["../../../src/firebase/native-item-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"native-item-store.d.ts","sourceRoot":"","sources":["../../../src/firebase/native-item-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAOtD,MAAM,MAAM,yBAAyB,GAAG,uBAAuB,CAAC;AAEhE,qBAAa,eAAe;IAGd,OAAO,CAAC,QAAQ,CAAC,KAAK;IAFlC,OAAO,CAAC,WAAW,CAAmF;gBAEzE,KAAK,EAAE,cAAc;IAElD,OAAO,CAAC,aAAa;IAUrB,qEAAqE;IACrE,qBAAqB,CAAC,SAAS,CAAC,EAAE,SAAS,GAAG,IAAI;YAKpC,kBAAkB;IAO1B,GAAG,CACP,SAAS,EAAE,SAAS,EACpB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,yBAAyB,GAAG,IAAI,CAAC;IAMtC,MAAM,CAAC,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,yBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC;IAK9E,MAAM,CAAC,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK3D,WAAW,CACf,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,yBAAyB,EAAE,GACnC,OAAO,CAAC,IAAI,CAAC;YAaF,gBAAgB;IA6B9B;;;;OAIG;IACG,IAAI,CACR,SAAS,EAAE,SAAS,EACpB,OAAO,CAAC,EAAE;QACR,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACnC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;KAC/B,GACA,OAAO,CAAC,yBAAyB,EAAE,CAAC;CAcxC"}
|
|
@@ -1,42 +1,61 @@
|
|
|
1
1
|
import { FirestoreStore } from "./firestore-store.js";
|
|
2
|
+
import { flatNativeItemsCollectionRef, legacyNativeItemsCollectionRef, resolveNativeItemsLayout, } from "./catalog-data-paths.js";
|
|
2
3
|
export class NativeItemStore {
|
|
3
4
|
store;
|
|
5
|
+
layoutCache = new Map();
|
|
4
6
|
constructor(store) {
|
|
5
7
|
this.store = store;
|
|
6
8
|
}
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
.
|
|
12
|
-
.
|
|
9
|
+
layoutPromise(catalogId) {
|
|
10
|
+
const key = String(catalogId);
|
|
11
|
+
let p = this.layoutCache.get(key);
|
|
12
|
+
if (!p) {
|
|
13
|
+
p = resolveNativeItemsLayout(this.store.firestore, catalogId);
|
|
14
|
+
this.layoutCache.set(key, p);
|
|
15
|
+
}
|
|
16
|
+
return p;
|
|
17
|
+
}
|
|
18
|
+
/** Invalidate cached layout for a catalog (e.g. after migration). */
|
|
19
|
+
invalidateLayoutCache(catalogId) {
|
|
20
|
+
if (catalogId == null)
|
|
21
|
+
this.layoutCache.clear();
|
|
22
|
+
else
|
|
23
|
+
this.layoutCache.delete(String(catalogId));
|
|
24
|
+
}
|
|
25
|
+
async itemsCollectionRef(catalogId) {
|
|
26
|
+
const layout = await this.layoutPromise(catalogId);
|
|
27
|
+
return layout === "legacy"
|
|
28
|
+
? legacyNativeItemsCollectionRef(this.store.firestore, catalogId)
|
|
29
|
+
: flatNativeItemsCollectionRef(this.store.firestore, catalogId);
|
|
13
30
|
}
|
|
14
31
|
async get(catalogId, itemId) {
|
|
15
|
-
const
|
|
32
|
+
const col = await this.itemsCollectionRef(catalogId);
|
|
33
|
+
const snap = await col.doc(String(itemId)).get();
|
|
16
34
|
return snap.exists ? snap.data() : null;
|
|
17
35
|
}
|
|
18
36
|
async upsert(catalogId, record) {
|
|
19
|
-
await this.
|
|
37
|
+
const col = await this.itemsCollectionRef(catalogId);
|
|
38
|
+
await col.doc(String(record.itemId)).set(record, { merge: true });
|
|
20
39
|
}
|
|
21
40
|
async delete(catalogId, itemId) {
|
|
22
|
-
await this.
|
|
41
|
+
const col = await this.itemsCollectionRef(catalogId);
|
|
42
|
+
await col.doc(String(itemId)).delete();
|
|
23
43
|
}
|
|
24
44
|
async batchUpsert(catalogId, records) {
|
|
45
|
+
const col = await this.itemsCollectionRef(catalogId);
|
|
25
46
|
const chunkSize = 450; // keep below Firestore 500 writes
|
|
26
47
|
for (let i = 0; i < records.length; i += chunkSize) {
|
|
27
48
|
const chunk = records.slice(i, i + chunkSize);
|
|
28
49
|
const batch = this.store.firestore.batch();
|
|
29
50
|
for (const r of chunk) {
|
|
30
|
-
batch.set(
|
|
51
|
+
batch.set(col.doc(String(r.itemId)), r, { merge: true });
|
|
31
52
|
}
|
|
32
53
|
await batch.commit();
|
|
33
54
|
}
|
|
34
55
|
}
|
|
35
|
-
async
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
.doc(String(catalogId))
|
|
39
|
-
.collection("items");
|
|
56
|
+
async executeListQuery(catalogId, options) {
|
|
57
|
+
const col = await this.itemsCollectionRef(catalogId);
|
|
58
|
+
let q = col;
|
|
40
59
|
const filterEq = options?.filterEq ?? {};
|
|
41
60
|
for (const [k, v] of Object.entries(filterEq)) {
|
|
42
61
|
q = q.where(`indexed.${k}`, "==", v);
|
|
@@ -47,9 +66,25 @@ export class NativeItemStore {
|
|
|
47
66
|
}
|
|
48
67
|
const offset = options?.offset ?? 0;
|
|
49
68
|
const limit = options?.limit ?? 100;
|
|
50
|
-
// Firestore doesn't support skip/offset directly; emulate by reading + slicing.
|
|
51
69
|
const snap = await q.limit(offset + limit).get();
|
|
52
70
|
return snap.docs.slice(offset, offset + limit).map((d) => d.data());
|
|
53
71
|
}
|
|
72
|
+
/**
|
|
73
|
+
* Lists native rows. If the process cached a legacy vs flat layout choice and data moved
|
|
74
|
+
* (for example after a console migration), the first unconstrained empty page triggers a
|
|
75
|
+
* one-time re-resolve and a second query.
|
|
76
|
+
*/
|
|
77
|
+
async list(catalogId, options) {
|
|
78
|
+
const offset = options?.offset ?? 0;
|
|
79
|
+
const filterEq = options?.filterEq ?? {};
|
|
80
|
+
const sort = options?.sort ?? {};
|
|
81
|
+
const unconstrained = Object.keys(filterEq).length === 0 && Object.keys(sort).length === 0;
|
|
82
|
+
let records = await this.executeListQuery(catalogId, options);
|
|
83
|
+
if (records.length === 0 && offset === 0 && unconstrained) {
|
|
84
|
+
this.invalidateLayoutCache(catalogId);
|
|
85
|
+
records = await this.executeListQuery(catalogId, options);
|
|
86
|
+
}
|
|
87
|
+
return records;
|
|
88
|
+
}
|
|
54
89
|
}
|
|
55
90
|
//# sourceMappingURL=native-item-store.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"native-item-store.js","sourceRoot":"","sources":["../../../src/firebase/native-item-store.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"native-item-store.js","sourceRoot":"","sources":["../../../src/firebase/native-item-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +1,3 @@
|
|
|
1
1
|
export { buildRendererSnippetDocId } from "./renderer-metadata.js";
|
|
2
|
+
export { migrateNativeCatalogLayout, fixNativeCatalogDataMetadata, type MigrateNativeCatalogLayoutInput, type MigrateNativeCatalogLayoutResult, type MigrateNativeCatalogLayoutIssue, } from "./migrate-native-catalog-layout.js";
|
|
2
3
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/migrations/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/migrations/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,EACL,0BAA0B,EAC1B,4BAA4B,EAC5B,KAAK,+BAA+B,EACpC,KAAK,gCAAgC,EACrC,KAAK,+BAA+B,GACrC,MAAM,oCAAoC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/migrations/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/migrations/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,EACL,0BAA0B,EAC1B,4BAA4B,GAI7B,MAAM,oCAAoC,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { CatalogId } from "../contracts/ids.js";
|
|
2
|
+
import { CatalogStore } from "../firebase/catalog-store.js";
|
|
3
|
+
import { BindingStore } from "../firebase/binding-store.js";
|
|
4
|
+
import { DefinitionStore } from "../firebase/definition-store.js";
|
|
5
|
+
import { FirestoreStore } from "../firebase/firestore-store.js";
|
|
6
|
+
import { NativeItemStore } from "../firebase/native-item-store.js";
|
|
7
|
+
import { CatalogDataIndexStore } from "../firebase/catalog-data-index-store.js";
|
|
8
|
+
export type MigrateNativeCatalogLayoutInput = {
|
|
9
|
+
dryRun?: boolean;
|
|
10
|
+
verifyOnly?: boolean;
|
|
11
|
+
overwrite?: boolean;
|
|
12
|
+
deleteLegacy?: boolean;
|
|
13
|
+
iHaveBackups?: boolean;
|
|
14
|
+
continueOnError?: boolean;
|
|
15
|
+
catalogIds?: CatalogId[];
|
|
16
|
+
appId?: string;
|
|
17
|
+
/** Write local NDJSON lines under this directory (created if missing). */
|
|
18
|
+
exportFilesDir?: string;
|
|
19
|
+
};
|
|
20
|
+
export type MigrateNativeCatalogLayoutIssue = {
|
|
21
|
+
catalogId: string;
|
|
22
|
+
code: string;
|
|
23
|
+
message: string;
|
|
24
|
+
};
|
|
25
|
+
export type MigrateNativeCatalogLayoutResult = {
|
|
26
|
+
ok: boolean;
|
|
27
|
+
migratedCatalogs: string[];
|
|
28
|
+
docsCopied: number;
|
|
29
|
+
legacyDeleted: number;
|
|
30
|
+
issues: MigrateNativeCatalogLayoutIssue[];
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* After native item rows **already** live under flat `catalogData-{catalogId}-items`, align
|
|
34
|
+
* `catalogDefinitions` storage hints and seed `catalogData/{catalogId}` index metadata.
|
|
35
|
+
* Does **not** copy legacy `catalogData/{catalogId}/items` → flat; that is `migrateNativeCatalogLayout`.
|
|
36
|
+
* Used by the tail of native layout migration and by Firebase restore (which writes items to flat first).
|
|
37
|
+
*/
|
|
38
|
+
export declare function fixNativeCatalogDataMetadata(deps: {
|
|
39
|
+
definitions: DefinitionStore;
|
|
40
|
+
catalogDataIndex: CatalogDataIndexStore;
|
|
41
|
+
nativeItems: NativeItemStore;
|
|
42
|
+
}, catalogIds: CatalogId[], nowIso: string): Promise<void>;
|
|
43
|
+
export declare function migrateNativeCatalogLayout(deps: {
|
|
44
|
+
firestoreStore: FirestoreStore;
|
|
45
|
+
catalogs: CatalogStore;
|
|
46
|
+
bindings: BindingStore;
|
|
47
|
+
nativeItems: NativeItemStore;
|
|
48
|
+
catalogDataIndex: CatalogDataIndexStore;
|
|
49
|
+
definitions: DefinitionStore;
|
|
50
|
+
}, input: MigrateNativeCatalogLayoutInput): Promise<MigrateNativeCatalogLayoutResult>;
|
|
51
|
+
//# sourceMappingURL=migrate-native-catalog-layout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate-native-catalog-layout.d.ts","sourceRoot":"","sources":["../../../src/migrations/migrate-native-catalog-layout.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAGrD,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,OAAO,EAAE,qBAAqB,EAAE,MAAM,yCAAyC,CAAC;AAOhF,MAAM,MAAM,+BAA+B,GAAG;IAC5C,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,UAAU,CAAC,EAAE,SAAS,EAAE,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,0EAA0E;IAC1E,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,+BAA+B,GAAG;IAC5C,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,gCAAgC,GAAG;IAC7C,EAAE,EAAE,OAAO,CAAC;IACZ,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,+BAA+B,EAAE,CAAC;CAC3C,CAAC;AAoCF;;;;;GAKG;AACH,wBAAsB,4BAA4B,CAChD,IAAI,EAAE;IACJ,WAAW,EAAE,eAAe,CAAC;IAC7B,gBAAgB,EAAE,qBAAqB,CAAC;IACxC,WAAW,EAAE,eAAe,CAAC;CAC9B,EACD,UAAU,EAAE,SAAS,EAAE,EACvB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAgBf;AAED,wBAAsB,0BAA0B,CAC9C,IAAI,EAAE;IACJ,cAAc,EAAE,cAAc,CAAC;IAC/B,QAAQ,EAAE,YAAY,CAAC;IACvB,QAAQ,EAAE,YAAY,CAAC;IACvB,WAAW,EAAE,eAAe,CAAC;IAC7B,gBAAgB,EAAE,qBAAqB,CAAC;IACxC,WAAW,EAAE,eAAe,CAAC;CAC9B,EACD,KAAK,EAAE,+BAA+B,GACrC,OAAO,CAAC,gCAAgC,CAAC,CA4K3C"}
|