@lpdjs/firestore-repo-service 2.2.6 → 2.2.8

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 (37) hide show
  1. package/dist/{create-servers-DmggzSb3.d.cts → create-servers-BGtAS0oG.d.cts} +3 -3
  2. package/dist/{create-servers-D4-NGpKm.d.ts → create-servers-DMszgNtg.d.ts} +3 -3
  3. package/dist/history/index.cjs +2 -0
  4. package/dist/history/index.cjs.map +1 -0
  5. package/dist/history/index.d.cts +126 -0
  6. package/dist/history/index.d.ts +126 -0
  7. package/dist/history/index.js +2 -0
  8. package/dist/history/index.js.map +1 -0
  9. package/dist/{index-Cvip2Sgt.d.ts → index-BSZP0Gz9.d.ts} +3 -3
  10. package/dist/{index-DpD4DEqH.d.cts → index-D7oj3Pft.d.cts} +3 -3
  11. package/dist/index.cjs +120 -102
  12. package/dist/index.cjs.map +1 -1
  13. package/dist/index.d.cts +21 -12
  14. package/dist/index.d.ts +21 -12
  15. package/dist/index.js +120 -102
  16. package/dist/index.js.map +1 -1
  17. package/dist/{openapi-B3P2F8op.d.ts → openapi-BdqIkSjO.d.ts} +1 -1
  18. package/dist/{openapi-UJJ1aCFk.d.cts → openapi-lY43PZXy.d.cts} +1 -1
  19. package/dist/read-DfXXxhO4.d.cts +230 -0
  20. package/dist/read-DfXXxhO4.d.ts +230 -0
  21. package/dist/servers/admin/index.cjs +31 -13
  22. package/dist/servers/admin/index.cjs.map +1 -1
  23. package/dist/servers/admin/index.d.cts +4 -2
  24. package/dist/servers/admin/index.d.ts +4 -2
  25. package/dist/servers/admin/index.js +31 -13
  26. package/dist/servers/admin/index.js.map +1 -1
  27. package/dist/servers/crud/index.d.cts +6 -4
  28. package/dist/servers/crud/index.d.ts +6 -4
  29. package/dist/servers/index.cjs +33 -15
  30. package/dist/servers/index.cjs.map +1 -1
  31. package/dist/servers/index.d.cts +6 -5
  32. package/dist/servers/index.d.ts +6 -5
  33. package/dist/servers/index.js +33 -15
  34. package/dist/servers/index.js.map +1 -1
  35. package/dist/{types-Z9Qy8Xmx.d.ts → types-BESS89Fu.d.cts} +30 -12
  36. package/dist/{types-Z9Qy8Xmx.d.cts → types-BVUFVcpl.d.ts} +30 -12
  37. package/package.json +17 -1
@@ -1,6 +1,7 @@
1
1
  import * as zod from 'zod';
2
2
  import { z } from 'zod';
3
3
  import { HttpsOptions } from 'firebase-functions/v2/https';
4
+ import { H as HistoryConfigForModel, a as HistoryMethods } from './read-DfXXxhO4.cjs';
4
5
  import { DocumentReference, Firestore, DocumentSnapshot, WhereFilterOp, Query, CollectionReference, WriteBatch, Transaction } from 'firebase-admin/firestore';
5
6
 
6
7
  /**
@@ -145,7 +146,7 @@ interface RelationConfig<TRepoKey extends string = string, TForeignKey extends s
145
146
  */
146
147
  type RelationalKeys<T = any, TMapping = any> = {
147
148
  [K in keyof T]?: TMapping extends Record<string, any> ? {
148
- [R in keyof TMapping]: TMapping[R] extends RepositoryConfig<any, infer FKeys, any, any, any, any, any, any> ? {
149
+ [R in keyof TMapping]: TMapping[R] extends RepositoryConfig<any, infer FKeys, any, any, any, any, any, any, any, any, any> ? {
149
150
  repo: R;
150
151
  key: FKeys[number];
151
152
  type: "one" | "many";
@@ -165,7 +166,7 @@ type RelationalKeys<T = any, TMapping = any> = {
165
166
  * @template TCreatedKey - The field name to store the creation timestamp (optional)
166
167
  * @template TUpdatedKey - The field name to store the update timestamp (optional)
167
168
  */
168
- interface RepositoryConfig<T, TForeignKeys extends readonly (keyof T)[], TQueryKeys extends readonly (keyof T)[], TIsGroup extends boolean = boolean, TRefCb = any, TRelationalKeys = {}, TDocumentKey extends keyof T = keyof T, TPathKey extends keyof T | undefined = undefined, TCreatedKey extends keyof T | undefined = undefined, TUpdatedKey extends keyof T | undefined = undefined> {
169
+ interface RepositoryConfig<T, TForeignKeys extends readonly (keyof T)[], TQueryKeys extends readonly (keyof T)[], TIsGroup extends boolean = boolean, TRefCb = any, TRelationalKeys = {}, TDocumentKey extends keyof T = keyof T, TPathKey extends keyof T | undefined = undefined, TCreatedKey extends keyof T | undefined = undefined, TUpdatedKey extends keyof T | undefined = undefined, THistoryEnabled extends boolean = false> {
169
170
  path: string;
170
171
  isGroup: TIsGroup;
171
172
  foreignKeys: TForeignKeys;
@@ -179,6 +180,16 @@ interface RepositoryConfig<T, TForeignKeys extends readonly (keyof T)[], TQueryK
179
180
  schema?: zod.ZodObject<any>;
180
181
  refCb?: TRefCb;
181
182
  relationalKeys?: TRelationalKeys;
183
+ /**
184
+ * Optional change-history configuration. When `enabled: true`, the
185
+ * `repo.history.*` read API is exposed and `createHistoryTriggers(...)`
186
+ * will register Firestore triggers for this repo.
187
+ *
188
+ * @see import("../history/types").HistoryConfigForModel
189
+ */
190
+ history?: HistoryConfigForModel<T> & {
191
+ enabled: THistoryEnabled;
192
+ };
182
193
  documentRef: TRefCb extends undefined ? TIsGroup extends true ? (...pathSegments: string[]) => DocumentReference : (docId: string) => DocumentReference : ExtractDocumentRefSignature<TRefCb>;
183
194
  update: TRefCb extends undefined ? TIsGroup extends true ? (...args: [...string[], Partial<T>]) => Promise<T> : (docId: string, data: Partial<T>) => Promise<T> : ExtractUpdateSignature<TRefCb, T>;
184
195
  }
@@ -380,17 +391,17 @@ interface PaginationWithIncludeOptionsTyped<T, TRelationalKeys, K extends keyof
380
391
  * Helper type to get the system keys (documentKey + pathKey + updatedKey) that should be excluded from updates
381
392
  * @internal
382
393
  */
383
- type SystemKeys<T extends RepositoryConfig<any, any, any, any, any, any, any, any, any, any>> = T["documentKey"] | Extract<T["pathKey"], keyof T["type"]> | Extract<T["updatedKey"], keyof T["type"]>;
394
+ type SystemKeys<T extends RepositoryConfig<any, any, any, any, any, any, any, any, any, any, any>> = T["documentKey"] | Extract<T["pathKey"], keyof T["type"]> | Extract<T["updatedKey"], keyof T["type"]>;
384
395
  /**
385
396
  * Type for updatable data - excludes documentKey, pathKey and updatedKey (all auto-managed)
386
397
  * @internal
387
398
  */
388
- type UpdatableData<T extends RepositoryConfig<any, any, any, any, any, any, any, any, any, any>> = Omit<Partial<T["type"]>, SystemKeys<T>>;
399
+ type UpdatableData<T extends RepositoryConfig<any, any, any, any, any, any, any, any, any, any, any>> = Omit<Partial<T["type"]>, SystemKeys<T>>;
389
400
  /**
390
401
  * Type for create data - excludes pathKey, createdKey and updatedKey (auto-managed), documentKey is optional
391
402
  * @internal
392
403
  */
393
- type CreateData<T extends RepositoryConfig<any, any, any, any, any, any, any, any, any, any>> = Omit<T["type"], T["documentKey"] | Extract<T["pathKey"], keyof T["type"]> | Extract<T["createdKey"], keyof T["type"]> | Extract<T["updatedKey"], keyof T["type"]>> & {
404
+ type CreateData<T extends RepositoryConfig<any, any, any, any, any, any, any, any, any, any, any>> = Omit<T["type"], T["documentKey"] | Extract<T["pathKey"], keyof T["type"]> | Extract<T["createdKey"], keyof T["type"]> | Extract<T["updatedKey"], keyof T["type"]>> & {
394
405
  [K in T["documentKey"]]?: T["type"][K];
395
406
  };
396
407
  /**
@@ -413,7 +424,7 @@ type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (
413
424
  * Return type is narrowed based on whether returnDoc is true.
414
425
  * @internal
415
426
  */
416
- type GenerateGetMethods<TConfig extends RepositoryConfig<any, any, any, any, any, any, any, any, any, any>> = {
427
+ type GenerateGetMethods<TConfig extends RepositoryConfig<any, any, any, any, any, any, any, any, any, any, any>> = {
417
428
  [K in TConfig["foreignKeys"][number] as K extends string ? `by${Capitalize<K>}` : never]: <ReturnDoc extends boolean = false>(value: TConfig["type"][K extends keyof TConfig["type"] ? K : never], options?: ReturnDoc | (GetOptions<TConfig["type"]> & {
418
429
  returnDoc?: ReturnDoc;
419
430
  })) => Promise<GetResult<TConfig["type"], ReturnDoc>>;
@@ -422,13 +433,13 @@ type GenerateGetMethods<TConfig extends RepositoryConfig<any, any, any, any, any
422
433
  * Generates query.by* methods from query keys
423
434
  * @internal
424
435
  */
425
- type GenerateQueryMethods<TConfig extends RepositoryConfig<any, any, any, any, any, any, any, any, any, any>> = {
436
+ type GenerateQueryMethods<TConfig extends RepositoryConfig<any, any, any, any, any, any, any, any, any, any, any>> = {
426
437
  [K in TConfig["queryKeys"][number] as K extends string ? `by${Capitalize<K>}` : never]: (value: TConfig["type"][K], options?: QueryOptions<TConfig["type"]>) => Promise<TConfig["type"][]>;
427
438
  };
428
439
  /**
429
440
  * Configured repository with organized methods
430
441
  */
431
- type ConfiguredRepository<T extends RepositoryConfig<any, any, any, any, any, any, any, any, any, any>> = {
442
+ type ConfiguredRepository<T extends RepositoryConfig<any, any, any, any, any, any, any, any, any, any, any>> = {
432
443
  /** @internal Phantom property to expose the model type for generic extraction */
433
444
  readonly _modelType: T["type"];
434
445
  /** @internal Whether this is a collectionGroup repository */
@@ -512,6 +523,13 @@ type ConfiguredRepository<T extends RepositoryConfig<any, any, any, any, any, an
512
523
  populate: <K extends keyof NonNullable<T["relationalKeys"]>, TDoc extends Pick<T["type"], K & keyof T["type"]>>(document: TDoc, relationKeyOrOptions: K | K[] | PopulateOptionsTyped<NonNullable<T["relationalKeys"]>, K>) => Promise<TDoc & {
513
524
  populated: UnionToIntersection<K extends keyof NonNullable<T["relationalKeys"]> ? ExtractPopulatedFromRelation<NonNullable<T["relationalKeys"]>[K], K & string> : Record<string, never>>;
514
525
  }>;
526
+ /**
527
+ * Change-history namespace. Present at the type level when the repo is
528
+ * configured with `history.enabled: true`, otherwise `undefined` at runtime.
529
+ * Kept optional (rather than conditional) so `ConfiguredRepository<any>`
530
+ * stays assignable from any concrete repo config.
531
+ */
532
+ history?: HistoryMethods<T["type"]>;
515
533
  };
516
534
 
517
535
  /**
@@ -545,13 +563,13 @@ interface OpenAPISpecOptions {
545
563
  * `createRepositoryConfig(schema)`).
546
564
  * @internal
547
565
  */
548
- type RepoModelType<TRepo> = TRepo extends ConfiguredRepository<infer C> ? C extends RepositoryConfig<infer T, any, any, any, any, any, any, any, any, any> ? T : never : never;
566
+ type RepoModelType<TRepo> = TRepo extends ConfiguredRepository<infer C> ? C extends RepositoryConfig<infer T, any, any, any, any, any, any, any, any, any, any> ? T : never : never;
549
567
  /**
550
568
  * Extracts the auto-managed system keys (documentKey, pathKey, createdKey, updatedKey)
551
569
  * from a `ConfiguredRepository`. These keys must never appear in create/update payloads.
552
570
  * @internal
553
571
  */
554
- type RepoSystemKeys<TRepo> = TRepo extends ConfiguredRepository<infer C> ? C extends RepositoryConfig<any, any, any, any, any, any, infer TDocKey, infer TPathKey, infer TCreatedKey, infer TUpdatedKey> ? (TDocKey extends string ? TDocKey : never) | (TPathKey extends string ? TPathKey : never) | (TCreatedKey extends string ? TCreatedKey : never) | (TUpdatedKey extends string ? TUpdatedKey : never) : never : never;
572
+ type RepoSystemKeys<TRepo> = TRepo extends ConfiguredRepository<infer C> ? C extends RepositoryConfig<any, any, any, any, any, any, infer TDocKey, infer TPathKey, infer TCreatedKey, infer TUpdatedKey, any> ? (TDocKey extends string ? TDocKey : never) | (TPathKey extends string ? TPathKey : never) | (TCreatedKey extends string ? TCreatedKey : never) | (TUpdatedKey extends string ? TUpdatedKey : never) : never : never;
555
573
  /**
556
574
  * `true` when `T` is `any` (the `0 extends (1 & T)` trick).
557
575
  * @internal
@@ -583,7 +601,7 @@ type RepoFieldPath<TRepo> = IsAny<TRepo> extends true ? string : IsAny<RepoModel
583
601
  * Falls back to `string` when `TRepo` is unresolved (`any`).
584
602
  * @internal
585
603
  */
586
- type RepoRelationKeys<TRepo> = IsAny<TRepo> extends true ? string : TRepo extends ConfiguredRepository<RepositoryConfig<any, any, any, any, any, infer TRelKeys, any, any, any, any>> ? IsAny<TRelKeys> extends true ? string : keyof TRelKeys & string : string;
604
+ type RepoRelationKeys<TRepo> = IsAny<TRepo> extends true ? string : TRepo extends ConfiguredRepository<RepositoryConfig<any, any, any, any, any, infer TRelKeys, any, any, any, any, any>> ? IsAny<TRelKeys> extends true ? string : keyof TRelKeys & string : string;
587
605
  /**
588
606
  * Configuration for a single repository in the CRUD server.
589
607
  *
@@ -650,7 +668,7 @@ interface CrudRepoConfig<TRepo extends ConfiguredRepository<any> = ConfiguredRep
650
668
  interface CrudRepoEntry {
651
669
  name: string;
652
670
  path: string;
653
- repo: ConfiguredRepository<RepositoryConfig<any, any, any, any, any, any, any, any, any, any>>;
671
+ repo: ConfiguredRepository<RepositoryConfig<any, any, any, any, any, any, any, any, any, any, any>>;
654
672
  schema: z.ZodObject<any>;
655
673
  /** Keys automatically managed by Firestore (docId, path, timestamps) — excluded from create/update payloads */
656
674
  systemKeys: string[];
@@ -1,6 +1,7 @@
1
1
  import * as zod from 'zod';
2
2
  import { z } from 'zod';
3
3
  import { HttpsOptions } from 'firebase-functions/v2/https';
4
+ import { H as HistoryConfigForModel, a as HistoryMethods } from './read-DfXXxhO4.js';
4
5
  import { DocumentReference, Firestore, DocumentSnapshot, WhereFilterOp, Query, CollectionReference, WriteBatch, Transaction } from 'firebase-admin/firestore';
5
6
 
6
7
  /**
@@ -145,7 +146,7 @@ interface RelationConfig<TRepoKey extends string = string, TForeignKey extends s
145
146
  */
146
147
  type RelationalKeys<T = any, TMapping = any> = {
147
148
  [K in keyof T]?: TMapping extends Record<string, any> ? {
148
- [R in keyof TMapping]: TMapping[R] extends RepositoryConfig<any, infer FKeys, any, any, any, any, any, any> ? {
149
+ [R in keyof TMapping]: TMapping[R] extends RepositoryConfig<any, infer FKeys, any, any, any, any, any, any, any, any, any> ? {
149
150
  repo: R;
150
151
  key: FKeys[number];
151
152
  type: "one" | "many";
@@ -165,7 +166,7 @@ type RelationalKeys<T = any, TMapping = any> = {
165
166
  * @template TCreatedKey - The field name to store the creation timestamp (optional)
166
167
  * @template TUpdatedKey - The field name to store the update timestamp (optional)
167
168
  */
168
- interface RepositoryConfig<T, TForeignKeys extends readonly (keyof T)[], TQueryKeys extends readonly (keyof T)[], TIsGroup extends boolean = boolean, TRefCb = any, TRelationalKeys = {}, TDocumentKey extends keyof T = keyof T, TPathKey extends keyof T | undefined = undefined, TCreatedKey extends keyof T | undefined = undefined, TUpdatedKey extends keyof T | undefined = undefined> {
169
+ interface RepositoryConfig<T, TForeignKeys extends readonly (keyof T)[], TQueryKeys extends readonly (keyof T)[], TIsGroup extends boolean = boolean, TRefCb = any, TRelationalKeys = {}, TDocumentKey extends keyof T = keyof T, TPathKey extends keyof T | undefined = undefined, TCreatedKey extends keyof T | undefined = undefined, TUpdatedKey extends keyof T | undefined = undefined, THistoryEnabled extends boolean = false> {
169
170
  path: string;
170
171
  isGroup: TIsGroup;
171
172
  foreignKeys: TForeignKeys;
@@ -179,6 +180,16 @@ interface RepositoryConfig<T, TForeignKeys extends readonly (keyof T)[], TQueryK
179
180
  schema?: zod.ZodObject<any>;
180
181
  refCb?: TRefCb;
181
182
  relationalKeys?: TRelationalKeys;
183
+ /**
184
+ * Optional change-history configuration. When `enabled: true`, the
185
+ * `repo.history.*` read API is exposed and `createHistoryTriggers(...)`
186
+ * will register Firestore triggers for this repo.
187
+ *
188
+ * @see import("../history/types").HistoryConfigForModel
189
+ */
190
+ history?: HistoryConfigForModel<T> & {
191
+ enabled: THistoryEnabled;
192
+ };
182
193
  documentRef: TRefCb extends undefined ? TIsGroup extends true ? (...pathSegments: string[]) => DocumentReference : (docId: string) => DocumentReference : ExtractDocumentRefSignature<TRefCb>;
183
194
  update: TRefCb extends undefined ? TIsGroup extends true ? (...args: [...string[], Partial<T>]) => Promise<T> : (docId: string, data: Partial<T>) => Promise<T> : ExtractUpdateSignature<TRefCb, T>;
184
195
  }
@@ -380,17 +391,17 @@ interface PaginationWithIncludeOptionsTyped<T, TRelationalKeys, K extends keyof
380
391
  * Helper type to get the system keys (documentKey + pathKey + updatedKey) that should be excluded from updates
381
392
  * @internal
382
393
  */
383
- type SystemKeys<T extends RepositoryConfig<any, any, any, any, any, any, any, any, any, any>> = T["documentKey"] | Extract<T["pathKey"], keyof T["type"]> | Extract<T["updatedKey"], keyof T["type"]>;
394
+ type SystemKeys<T extends RepositoryConfig<any, any, any, any, any, any, any, any, any, any, any>> = T["documentKey"] | Extract<T["pathKey"], keyof T["type"]> | Extract<T["updatedKey"], keyof T["type"]>;
384
395
  /**
385
396
  * Type for updatable data - excludes documentKey, pathKey and updatedKey (all auto-managed)
386
397
  * @internal
387
398
  */
388
- type UpdatableData<T extends RepositoryConfig<any, any, any, any, any, any, any, any, any, any>> = Omit<Partial<T["type"]>, SystemKeys<T>>;
399
+ type UpdatableData<T extends RepositoryConfig<any, any, any, any, any, any, any, any, any, any, any>> = Omit<Partial<T["type"]>, SystemKeys<T>>;
389
400
  /**
390
401
  * Type for create data - excludes pathKey, createdKey and updatedKey (auto-managed), documentKey is optional
391
402
  * @internal
392
403
  */
393
- type CreateData<T extends RepositoryConfig<any, any, any, any, any, any, any, any, any, any>> = Omit<T["type"], T["documentKey"] | Extract<T["pathKey"], keyof T["type"]> | Extract<T["createdKey"], keyof T["type"]> | Extract<T["updatedKey"], keyof T["type"]>> & {
404
+ type CreateData<T extends RepositoryConfig<any, any, any, any, any, any, any, any, any, any, any>> = Omit<T["type"], T["documentKey"] | Extract<T["pathKey"], keyof T["type"]> | Extract<T["createdKey"], keyof T["type"]> | Extract<T["updatedKey"], keyof T["type"]>> & {
394
405
  [K in T["documentKey"]]?: T["type"][K];
395
406
  };
396
407
  /**
@@ -413,7 +424,7 @@ type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (
413
424
  * Return type is narrowed based on whether returnDoc is true.
414
425
  * @internal
415
426
  */
416
- type GenerateGetMethods<TConfig extends RepositoryConfig<any, any, any, any, any, any, any, any, any, any>> = {
427
+ type GenerateGetMethods<TConfig extends RepositoryConfig<any, any, any, any, any, any, any, any, any, any, any>> = {
417
428
  [K in TConfig["foreignKeys"][number] as K extends string ? `by${Capitalize<K>}` : never]: <ReturnDoc extends boolean = false>(value: TConfig["type"][K extends keyof TConfig["type"] ? K : never], options?: ReturnDoc | (GetOptions<TConfig["type"]> & {
418
429
  returnDoc?: ReturnDoc;
419
430
  })) => Promise<GetResult<TConfig["type"], ReturnDoc>>;
@@ -422,13 +433,13 @@ type GenerateGetMethods<TConfig extends RepositoryConfig<any, any, any, any, any
422
433
  * Generates query.by* methods from query keys
423
434
  * @internal
424
435
  */
425
- type GenerateQueryMethods<TConfig extends RepositoryConfig<any, any, any, any, any, any, any, any, any, any>> = {
436
+ type GenerateQueryMethods<TConfig extends RepositoryConfig<any, any, any, any, any, any, any, any, any, any, any>> = {
426
437
  [K in TConfig["queryKeys"][number] as K extends string ? `by${Capitalize<K>}` : never]: (value: TConfig["type"][K], options?: QueryOptions<TConfig["type"]>) => Promise<TConfig["type"][]>;
427
438
  };
428
439
  /**
429
440
  * Configured repository with organized methods
430
441
  */
431
- type ConfiguredRepository<T extends RepositoryConfig<any, any, any, any, any, any, any, any, any, any>> = {
442
+ type ConfiguredRepository<T extends RepositoryConfig<any, any, any, any, any, any, any, any, any, any, any>> = {
432
443
  /** @internal Phantom property to expose the model type for generic extraction */
433
444
  readonly _modelType: T["type"];
434
445
  /** @internal Whether this is a collectionGroup repository */
@@ -512,6 +523,13 @@ type ConfiguredRepository<T extends RepositoryConfig<any, any, any, any, any, an
512
523
  populate: <K extends keyof NonNullable<T["relationalKeys"]>, TDoc extends Pick<T["type"], K & keyof T["type"]>>(document: TDoc, relationKeyOrOptions: K | K[] | PopulateOptionsTyped<NonNullable<T["relationalKeys"]>, K>) => Promise<TDoc & {
513
524
  populated: UnionToIntersection<K extends keyof NonNullable<T["relationalKeys"]> ? ExtractPopulatedFromRelation<NonNullable<T["relationalKeys"]>[K], K & string> : Record<string, never>>;
514
525
  }>;
526
+ /**
527
+ * Change-history namespace. Present at the type level when the repo is
528
+ * configured with `history.enabled: true`, otherwise `undefined` at runtime.
529
+ * Kept optional (rather than conditional) so `ConfiguredRepository<any>`
530
+ * stays assignable from any concrete repo config.
531
+ */
532
+ history?: HistoryMethods<T["type"]>;
515
533
  };
516
534
 
517
535
  /**
@@ -545,13 +563,13 @@ interface OpenAPISpecOptions {
545
563
  * `createRepositoryConfig(schema)`).
546
564
  * @internal
547
565
  */
548
- type RepoModelType<TRepo> = TRepo extends ConfiguredRepository<infer C> ? C extends RepositoryConfig<infer T, any, any, any, any, any, any, any, any, any> ? T : never : never;
566
+ type RepoModelType<TRepo> = TRepo extends ConfiguredRepository<infer C> ? C extends RepositoryConfig<infer T, any, any, any, any, any, any, any, any, any, any> ? T : never : never;
549
567
  /**
550
568
  * Extracts the auto-managed system keys (documentKey, pathKey, createdKey, updatedKey)
551
569
  * from a `ConfiguredRepository`. These keys must never appear in create/update payloads.
552
570
  * @internal
553
571
  */
554
- type RepoSystemKeys<TRepo> = TRepo extends ConfiguredRepository<infer C> ? C extends RepositoryConfig<any, any, any, any, any, any, infer TDocKey, infer TPathKey, infer TCreatedKey, infer TUpdatedKey> ? (TDocKey extends string ? TDocKey : never) | (TPathKey extends string ? TPathKey : never) | (TCreatedKey extends string ? TCreatedKey : never) | (TUpdatedKey extends string ? TUpdatedKey : never) : never : never;
572
+ type RepoSystemKeys<TRepo> = TRepo extends ConfiguredRepository<infer C> ? C extends RepositoryConfig<any, any, any, any, any, any, infer TDocKey, infer TPathKey, infer TCreatedKey, infer TUpdatedKey, any> ? (TDocKey extends string ? TDocKey : never) | (TPathKey extends string ? TPathKey : never) | (TCreatedKey extends string ? TCreatedKey : never) | (TUpdatedKey extends string ? TUpdatedKey : never) : never : never;
555
573
  /**
556
574
  * `true` when `T` is `any` (the `0 extends (1 & T)` trick).
557
575
  * @internal
@@ -583,7 +601,7 @@ type RepoFieldPath<TRepo> = IsAny<TRepo> extends true ? string : IsAny<RepoModel
583
601
  * Falls back to `string` when `TRepo` is unresolved (`any`).
584
602
  * @internal
585
603
  */
586
- type RepoRelationKeys<TRepo> = IsAny<TRepo> extends true ? string : TRepo extends ConfiguredRepository<RepositoryConfig<any, any, any, any, any, infer TRelKeys, any, any, any, any>> ? IsAny<TRelKeys> extends true ? string : keyof TRelKeys & string : string;
604
+ type RepoRelationKeys<TRepo> = IsAny<TRepo> extends true ? string : TRepo extends ConfiguredRepository<RepositoryConfig<any, any, any, any, any, infer TRelKeys, any, any, any, any, any>> ? IsAny<TRelKeys> extends true ? string : keyof TRelKeys & string : string;
587
605
  /**
588
606
  * Configuration for a single repository in the CRUD server.
589
607
  *
@@ -650,7 +668,7 @@ interface CrudRepoConfig<TRepo extends ConfiguredRepository<any> = ConfiguredRep
650
668
  interface CrudRepoEntry {
651
669
  name: string;
652
670
  path: string;
653
- repo: ConfiguredRepository<RepositoryConfig<any, any, any, any, any, any, any, any, any, any>>;
671
+ repo: ConfiguredRepository<RepositoryConfig<any, any, any, any, any, any, any, any, any, any, any>>;
654
672
  schema: z.ZodObject<any>;
655
673
  /** Keys automatically managed by Firestore (docId, path, timestamps) — excluded from create/update payloads */
656
674
  systemKeys: string[];
package/package.json CHANGED
@@ -1,6 +1,9 @@
1
1
  {
2
2
  "name": "@lpdjs/firestore-repo-service",
3
- "version": "2.2.6",
3
+ "version": "2.2.8",
4
+ "workspaces": [
5
+ "test/functions"
6
+ ],
4
7
  "description": "⚡ Type-safe Firestore ORM with auto-generated repositories, advanced queries, relations with typed select, pagination with include, batch/bulk operations, aggregations and transactions.",
5
8
  "type": "module",
6
9
  "main": "./dist/index.cjs",
@@ -37,6 +40,16 @@
37
40
  "default": "./dist/sync/bigquery.js"
38
41
  }
39
42
  },
43
+ "./history": {
44
+ "require": {
45
+ "types": "./dist/history/index.d.cts",
46
+ "default": "./dist/history/index.cjs"
47
+ },
48
+ "import": {
49
+ "types": "./dist/history/index.d.ts",
50
+ "default": "./dist/history/index.js"
51
+ }
52
+ },
40
53
  "./servers": {
41
54
  "require": {
42
55
  "types": "./dist/servers/index.d.cts",
@@ -84,6 +97,9 @@
84
97
  ],
85
98
  "sync/bigquery": [
86
99
  "./dist/sync/bigquery.d.ts"
100
+ ],
101
+ "history": [
102
+ "./dist/history/index.d.ts"
87
103
  ]
88
104
  }
89
105
  },