@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.
Files changed (106) hide show
  1. package/README.md +60 -7
  2. package/dist/src/catalox/backup-data.d.ts +40 -0
  3. package/dist/src/catalox/backup-data.d.ts.map +1 -0
  4. package/dist/src/catalox/backup-data.js +522 -0
  5. package/dist/src/catalox/backup-data.js.map +1 -0
  6. package/dist/src/catalox/catalox.d.ts +42 -0
  7. package/dist/src/catalox/catalox.d.ts.map +1 -1
  8. package/dist/src/catalox/catalox.js +127 -7
  9. package/dist/src/catalox/catalox.js.map +1 -1
  10. package/dist/src/catalox/firestore-gcs-compare.d.ts +15 -0
  11. package/dist/src/catalox/firestore-gcs-compare.d.ts.map +1 -0
  12. package/dist/src/catalox/firestore-gcs-compare.js +221 -0
  13. package/dist/src/catalox/firestore-gcs-compare.js.map +1 -0
  14. package/dist/src/catalox/firestore-gcs-transfer.d.ts +24 -0
  15. package/dist/src/catalox/firestore-gcs-transfer.d.ts.map +1 -0
  16. package/dist/src/catalox/firestore-gcs-transfer.js +346 -0
  17. package/dist/src/catalox/firestore-gcs-transfer.js.map +1 -0
  18. package/dist/src/catalox/index.d.ts +5 -0
  19. package/dist/src/catalox/index.d.ts.map +1 -1
  20. package/dist/src/catalox/index.js +5 -0
  21. package/dist/src/catalox/index.js.map +1 -1
  22. package/dist/src/catalox/native-catalog-layout-diagnostics.d.ts +29 -0
  23. package/dist/src/catalox/native-catalog-layout-diagnostics.d.ts.map +1 -0
  24. package/dist/src/catalox/native-catalog-layout-diagnostics.js +55 -0
  25. package/dist/src/catalox/native-catalog-layout-diagnostics.js.map +1 -0
  26. package/dist/src/catalox/restore-firestore-backup.d.ts +13 -0
  27. package/dist/src/catalox/restore-firestore-backup.d.ts.map +1 -0
  28. package/dist/src/catalox/restore-firestore-backup.js +326 -0
  29. package/dist/src/catalox/restore-firestore-backup.js.map +1 -0
  30. package/dist/src/cli/index.js +312 -1
  31. package/dist/src/cli/index.js.map +1 -1
  32. package/dist/src/contracts/backup.d.ts +36 -0
  33. package/dist/src/contracts/backup.d.ts.map +1 -0
  34. package/dist/src/contracts/backup.js +2 -0
  35. package/dist/src/contracts/backup.js.map +1 -0
  36. package/dist/src/contracts/catalog-data-index.d.ts +13 -0
  37. package/dist/src/contracts/catalog-data-index.d.ts.map +1 -0
  38. package/dist/src/contracts/catalog-data-index.js +2 -0
  39. package/dist/src/contracts/catalog-data-index.js.map +1 -0
  40. package/dist/src/contracts/catalogs.d.ts +8 -1
  41. package/dist/src/contracts/catalogs.d.ts.map +1 -1
  42. package/dist/src/contracts/catalogs.js +18 -1
  43. package/dist/src/contracts/catalogs.js.map +1 -1
  44. package/dist/src/contracts/gcs-firestore-compare.d.ts +64 -0
  45. package/dist/src/contracts/gcs-firestore-compare.d.ts.map +1 -0
  46. package/dist/src/contracts/gcs-firestore-compare.js +2 -0
  47. package/dist/src/contracts/gcs-firestore-compare.js.map +1 -0
  48. package/dist/src/contracts/gcs-firestore-transfer.d.ts +94 -0
  49. package/dist/src/contracts/gcs-firestore-transfer.d.ts.map +1 -0
  50. package/dist/src/contracts/gcs-firestore-transfer.js +2 -0
  51. package/dist/src/contracts/gcs-firestore-transfer.js.map +1 -0
  52. package/dist/src/contracts/index.d.ts +6 -0
  53. package/dist/src/contracts/index.d.ts.map +1 -1
  54. package/dist/src/contracts/index.js +1 -0
  55. package/dist/src/contracts/index.js.map +1 -1
  56. package/dist/src/contracts/restore.d.ts +44 -0
  57. package/dist/src/contracts/restore.d.ts.map +1 -0
  58. package/dist/src/contracts/restore.js +2 -0
  59. package/dist/src/contracts/restore.js.map +1 -0
  60. package/dist/src/firebase/catalog-data-index-store.d.ts +14 -0
  61. package/dist/src/firebase/catalog-data-index-store.d.ts.map +1 -0
  62. package/dist/src/firebase/catalog-data-index-store.js +33 -0
  63. package/dist/src/firebase/catalog-data-index-store.js.map +1 -0
  64. package/dist/src/firebase/catalog-data-paths.d.ts +14 -0
  65. package/dist/src/firebase/catalog-data-paths.d.ts.map +1 -0
  66. package/dist/src/firebase/catalog-data-paths.js +31 -0
  67. package/dist/src/firebase/catalog-data-paths.js.map +1 -0
  68. package/dist/src/firebase/index.d.ts +2 -0
  69. package/dist/src/firebase/index.d.ts.map +1 -1
  70. package/dist/src/firebase/index.js +2 -0
  71. package/dist/src/firebase/index.js.map +1 -1
  72. package/dist/src/firebase/native-item-store.d.ts +11 -1
  73. package/dist/src/firebase/native-item-store.d.ts.map +1 -1
  74. package/dist/src/firebase/native-item-store.js +51 -16
  75. package/dist/src/firebase/native-item-store.js.map +1 -1
  76. package/dist/src/migrations/index.d.ts +1 -0
  77. package/dist/src/migrations/index.d.ts.map +1 -1
  78. package/dist/src/migrations/index.js +1 -0
  79. package/dist/src/migrations/index.js.map +1 -1
  80. package/dist/src/migrations/migrate-native-catalog-layout.d.ts +51 -0
  81. package/dist/src/migrations/migrate-native-catalog-layout.d.ts.map +1 -0
  82. package/dist/src/migrations/migrate-native-catalog-layout.js +224 -0
  83. package/dist/src/migrations/migrate-native-catalog-layout.js.map +1 -0
  84. package/dist/test/integration/firestore.emulator.test.js +10 -2
  85. package/dist/test/integration/firestore.emulator.test.js.map +1 -1
  86. package/dist/test/unit/backup-timestamp.test.d.ts +2 -0
  87. package/dist/test/unit/backup-timestamp.test.d.ts.map +1 -0
  88. package/dist/test/unit/backup-timestamp.test.js +11 -0
  89. package/dist/test/unit/backup-timestamp.test.js.map +1 -0
  90. package/dist/test/unit/compact-catalog-filter.test.d.ts +2 -0
  91. package/dist/test/unit/compact-catalog-filter.test.d.ts.map +1 -0
  92. package/dist/test/unit/compact-catalog-filter.test.js +18 -0
  93. package/dist/test/unit/compact-catalog-filter.test.js.map +1 -0
  94. package/dist/test/unit/gcs-firestore-compare.test.d.ts +2 -0
  95. package/dist/test/unit/gcs-firestore-compare.test.d.ts.map +1 -0
  96. package/dist/test/unit/gcs-firestore-compare.test.js +14 -0
  97. package/dist/test/unit/gcs-firestore-compare.test.js.map +1 -0
  98. package/dist/test/unit/gcs-firestore-paths.test.d.ts +2 -0
  99. package/dist/test/unit/gcs-firestore-paths.test.d.ts.map +1 -0
  100. package/dist/test/unit/gcs-firestore-paths.test.js +16 -0
  101. package/dist/test/unit/gcs-firestore-paths.test.js.map +1 -0
  102. package/dist/test/unit/resolve-native-items-layout.test.d.ts +2 -0
  103. package/dist/test/unit/resolve-native-items-layout.test.d.ts.map +1 -0
  104. package/dist/test/unit/resolve-native-items-layout.test.js +50 -0
  105. package/dist/test/unit/resolve-native-items-layout.test.js.map +1 -0
  106. package/package.json +5 -1
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=gcs-firestore-compare.js.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=gcs-firestore-transfer.js.map
@@ -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":"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"}
@@ -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":"AAwGA,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAgD1E,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
+ {"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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=restore.js.map
@@ -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,4 +1,6 @@
1
1
  export * from "./firestore-store.js";
2
+ export * from "./catalog-data-paths.js";
3
+ export * from "./catalog-data-index-store.js";
2
4
  export * from "./app-store.js";
3
5
  export * from "./catalog-store.js";
4
6
  export * from "./binding-store.js";
@@ -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,4 +1,6 @@
1
1
  export * from "./firestore-store.js";
2
+ export * from "./catalog-data-paths.js";
3
+ export * from "./catalog-data-index-store.js";
2
4
  export * from "./app-store.js";
3
5
  export * from "./catalog-store.js";
4
6
  export * from "./binding-store.js";
@@ -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 itemDocRef;
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;AAEtD,MAAM,MAAM,yBAAyB,GAAG,uBAAuB,CAAC;AAEhE,qBAAa,eAAe;IACd,OAAO,CAAC,QAAQ,CAAC,KAAK;gBAAL,KAAK,EAAE,cAAc;IAElD,OAAO,CAAC,UAAU;IAQZ,GAAG,CACP,SAAS,EAAE,SAAS,EACpB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,yBAAyB,GAAG,IAAI,CAAC;IAKtC,MAAM,CAAC,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,yBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC;IAI9E,MAAM,CAAC,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI3D,WAAW,CACf,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,yBAAyB,EAAE,GACnC,OAAO,CAAC,IAAI,CAAC;IAYV,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;CAuBxC"}
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
- itemDocRef(catalogId, itemId) {
8
- return this.store
9
- .collection("catalogData")
10
- .doc(String(catalogId))
11
- .collection("items")
12
- .doc(String(itemId));
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 snap = await this.itemDocRef(catalogId, itemId).get();
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.itemDocRef(catalogId, record.itemId).set(record, { merge: true });
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.itemDocRef(catalogId, itemId).delete();
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(this.itemDocRef(catalogId, r.itemId), r, { merge: true });
51
+ batch.set(col.doc(String(r.itemId)), r, { merge: true });
31
52
  }
32
53
  await batch.commit();
33
54
  }
34
55
  }
35
- async list(catalogId, options) {
36
- let q = this.store
37
- .collection("catalogData")
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":"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"}
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,2 +1,3 @@
1
1
  export { buildRendererSnippetDocId } from "./renderer-metadata.js";
2
+ export { migrateNativeCatalogLayout, fixNativeCatalogDataMetadata, } from "./migrate-native-catalog-layout.js";
2
3
  //# sourceMappingURL=index.js.map
@@ -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"}