firesage
Version:
🔥 Extremely High Precision Typescript Wrapper for Firestore Web, Providing Unparalleled Type Safe and Dev Experience
69 lines (68 loc) • 7.07 kB
TypeScript
import { OriTimestamp } from './ori';
import { ErrorFieldValueInArray, ErrorUnassignedAbleFieldValue, NoUndefinedAndBannedTypes, NoDirectNestedArray, ErrorPossiblyUndefinedAsArrayElement, ErrorCollectionIDString } from './error';
import { IsValidID } from './validID';
import { FieldValues, UnassignedAbleFieldValue, ArrayUnionOrRemove, Increment, DeleteField, ServerTimestamp, PossiblyReadAsUndefined } from './fieldValue';
import { ObjectFlattenHybrid } from './objectFlatten';
import { RecursiveExcludePossiblyUndefinedFieldValue, RecursiveReplaceUnionInvolveObjectTypeWithErrorMsg } from './markUnionObjectAsError';
export declare type MetaType = {
collectionPath: string;
collectionID: string;
docID: string;
docPath: string;
read: Record<string, unknown>;
write: Record<string, unknown>;
writeFlatten: Record<string, unknown>;
compare: Record<string, unknown>;
base: Record<string, unknown>;
parent: MetaType | null;
ancestors: MetaType[];
};
export declare type MetaTypeCreator<Base extends Record<string, unknown>, CollectionID extends string, DocID extends string = string, Parent extends MetaType | null = null, Settings extends {
allFieldsPossiblyReadAsUndefined?: boolean;
banNull?: boolean;
} = {
allFieldsPossiblyReadAsUndefined: false;
banNull: false;
}> = {
base: Base;
read: {
[J in keyof RecursiveReplaceUnionInvolveObjectTypeWithErrorMsg<Base>]-?: ReadConverter<RecursiveReplaceUnionInvolveObjectTypeWithErrorMsg<Base>[J], Settings['allFieldsPossiblyReadAsUndefined'] extends true ? undefined : never, Settings['banNull'] extends true ? null : never>;
};
write: {
[J in keyof RecursiveReplaceUnionInvolveObjectTypeWithErrorMsg<RecursiveExcludePossiblyUndefinedFieldValue<Base>>]-?: WriteConverter<RecursiveReplaceUnionInvolveObjectTypeWithErrorMsg<RecursiveExcludePossiblyUndefinedFieldValue<Base>>[J], Settings['banNull'] extends true ? null : never>;
};
writeFlatten: {
[J in keyof ObjectFlattenHybrid<RecursiveReplaceUnionInvolveObjectTypeWithErrorMsg<RecursiveExcludePossiblyUndefinedFieldValue<Base>>>]-?: WriteConverter<ObjectFlattenHybrid<RecursiveReplaceUnionInvolveObjectTypeWithErrorMsg<RecursiveExcludePossiblyUndefinedFieldValue<Base>>>[J], Settings['banNull'] extends true ? null : never>;
};
compare: {
[J in keyof ObjectFlattenHybrid<RecursiveReplaceUnionInvolveObjectTypeWithErrorMsg<RecursiveExcludePossiblyUndefinedFieldValue<Base>>>]-?: CompareConverter<ObjectFlattenHybrid<RecursiveReplaceUnionInvolveObjectTypeWithErrorMsg<RecursiveExcludePossiblyUndefinedFieldValue<Base>>>[J], Settings['banNull'] extends true ? null : never>;
};
collectionID: NoUndefinedAndBannedTypes<string extends CollectionID ? ErrorCollectionIDString : IsValidID<CollectionID, 'Collection', 'ID'>, never>;
collectionPath: Parent extends MetaType ? `${Parent['collectionPath']}/${Parent['docID']}/${CollectionID}` : CollectionID;
docID: IsValidID<DocID, 'Document', 'ID'>;
docPath: Parent extends MetaType ? `${Parent['collectionPath']}/${Parent['docID']}/${CollectionID}/${DocID}` : `${CollectionID}/${DocID}`;
parent: Parent;
ancestors: Parent extends MetaType ? [
...Parent['ancestors'],
MetaTypeCreator<Base, CollectionID, DocID, Parent, Settings>
] : [MetaTypeCreator<Base, CollectionID, DocID, Parent, Settings>];
};
declare type ReadConverterArray<T, allFieldsPossiblyReadAsUndefined, BannedTypes, InArray extends boolean> = NoDirectNestedArray<T, T extends (infer A)[] ? ReadConverterArray<A, allFieldsPossiblyReadAsUndefined, BannedTypes, true>[] | (InArray extends true ? never : allFieldsPossiblyReadAsUndefined) : T extends FieldValues ? ErrorFieldValueInArray : T extends Date | OriTimestamp ? OriTimestamp | (InArray extends true ? never : allFieldsPossiblyReadAsUndefined) : T extends PossiblyReadAsUndefined ? InArray extends true ? ErrorPossiblyUndefinedAsArrayElement : undefined : T extends Record<string, unknown> ? {
[K in keyof T]-?: ReadConverterArray<T[K], allFieldsPossiblyReadAsUndefined, BannedTypes, false>;
} | (InArray extends true ? never : allFieldsPossiblyReadAsUndefined) : NoUndefinedAndBannedTypes<T, BannedTypes> | allFieldsPossiblyReadAsUndefined>;
declare type ReadConverter<T, allFieldsPossiblyReadAsUndefined, BannedTypes> = NoDirectNestedArray<T, T extends (infer A)[] ? ReadConverterArray<A, allFieldsPossiblyReadAsUndefined, BannedTypes, true>[] | allFieldsPossiblyReadAsUndefined : T extends ServerTimestamp | Date | OriTimestamp ? OriTimestamp | allFieldsPossiblyReadAsUndefined : T extends DeleteField | PossiblyReadAsUndefined ? undefined : T extends UnassignedAbleFieldValue ? ErrorUnassignedAbleFieldValue : T extends Record<string, unknown> ? {
[K in keyof T]-?: ReadConverter<T[K], allFieldsPossiblyReadAsUndefined, BannedTypes>;
} | allFieldsPossiblyReadAsUndefined : NoUndefinedAndBannedTypes<T, BannedTypes> | allFieldsPossiblyReadAsUndefined>;
declare type CompareConverterArray<T, BannedTypes> = NoDirectNestedArray<T, T extends (infer A)[] ? CompareConverterArray<A, BannedTypes>[] : T extends FieldValues ? ErrorFieldValueInArray : T extends Date | OriTimestamp ? OriTimestamp | Date : T extends PossiblyReadAsUndefined ? never : T extends Record<string, unknown> ? {
[K in keyof T]-?: CompareConverterArray<T[K], BannedTypes>;
} : NoUndefinedAndBannedTypes<T, BannedTypes>>;
declare type CompareConverter<T, BannedTypes> = NoDirectNestedArray<T, T extends (infer A)[] ? CompareConverterArray<A, BannedTypes>[] : T extends ServerTimestamp | Date | OriTimestamp ? OriTimestamp | Date : T extends UnassignedAbleFieldValue ? ErrorUnassignedAbleFieldValue : T extends PossiblyReadAsUndefined | DeleteField ? never : T extends Record<string, unknown> ? {
[K in keyof T]-?: CompareConverter<T[K], BannedTypes>;
} : NoUndefinedAndBannedTypes<T, BannedTypes>>;
declare type ArrayWriteConverter<T, BannedTypes> = NoDirectNestedArray<T, T extends (infer A)[] ? ArrayWriteConverter<A, BannedTypes>[] : T extends FieldValues ? ErrorFieldValueInArray : T extends OriTimestamp | Date ? OriTimestamp | Date : T extends PossiblyReadAsUndefined ? never : T extends Record<string, unknown> ? {
[K in keyof T]-?: ArrayWriteConverter<T[K], BannedTypes>;
} : NoUndefinedAndBannedTypes<T, BannedTypes>>;
declare type WriteConverter<T, BannedTypes> = NoDirectNestedArray<T, T extends (infer A)[] ? ArrayWriteConverter<A, BannedTypes>[] | ArrayUnionOrRemove<ArrayWriteConverter<A, BannedTypes>> : T extends ServerTimestamp ? ServerTimestamp : T extends number ? number extends T ? T | Increment : T : T extends DeleteField ? DeleteField : T extends UnassignedAbleFieldValue ? ErrorUnassignedAbleFieldValue : T extends OriTimestamp | Date ? OriTimestamp | Date : T extends PossiblyReadAsUndefined ? never : T extends Record<string, unknown> ? {
[K in keyof T]-?: WriteConverter<T[K], BannedTypes>;
} : NoUndefinedAndBannedTypes<T, BannedTypes>>;
export {};