@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.
- package/dist/{create-servers-DmggzSb3.d.cts → create-servers-BGtAS0oG.d.cts} +3 -3
- package/dist/{create-servers-D4-NGpKm.d.ts → create-servers-DMszgNtg.d.ts} +3 -3
- package/dist/history/index.cjs +2 -0
- package/dist/history/index.cjs.map +1 -0
- package/dist/history/index.d.cts +126 -0
- package/dist/history/index.d.ts +126 -0
- package/dist/history/index.js +2 -0
- package/dist/history/index.js.map +1 -0
- package/dist/{index-Cvip2Sgt.d.ts → index-BSZP0Gz9.d.ts} +3 -3
- package/dist/{index-DpD4DEqH.d.cts → index-D7oj3Pft.d.cts} +3 -3
- package/dist/index.cjs +120 -102
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +21 -12
- package/dist/index.d.ts +21 -12
- package/dist/index.js +120 -102
- package/dist/index.js.map +1 -1
- package/dist/{openapi-B3P2F8op.d.ts → openapi-BdqIkSjO.d.ts} +1 -1
- package/dist/{openapi-UJJ1aCFk.d.cts → openapi-lY43PZXy.d.cts} +1 -1
- package/dist/read-DfXXxhO4.d.cts +230 -0
- package/dist/read-DfXXxhO4.d.ts +230 -0
- package/dist/servers/admin/index.cjs +31 -13
- package/dist/servers/admin/index.cjs.map +1 -1
- package/dist/servers/admin/index.d.cts +4 -2
- package/dist/servers/admin/index.d.ts +4 -2
- package/dist/servers/admin/index.js +31 -13
- package/dist/servers/admin/index.js.map +1 -1
- package/dist/servers/crud/index.d.cts +6 -4
- package/dist/servers/crud/index.d.ts +6 -4
- package/dist/servers/index.cjs +33 -15
- package/dist/servers/index.cjs.map +1 -1
- package/dist/servers/index.d.cts +6 -5
- package/dist/servers/index.d.ts +6 -5
- package/dist/servers/index.js +33 -15
- package/dist/servers/index.js.map +1 -1
- package/dist/{types-Z9Qy8Xmx.d.ts → types-BESS89Fu.d.cts} +30 -12
- package/dist/{types-Z9Qy8Xmx.d.cts → types-BVUFVcpl.d.ts} +30 -12
- 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.
|
|
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
|
},
|