// /!\ IMPORTANT NOTICE /!\ dnt rmv the rmv as it's for generating types for frontend // rmv import { _ } from '../../../lib/good-cop/index-backend.js' // rmv export type RequestConfigShared = { disableEmittingEvents?: boolean // rmv } export type PopulateConfigObj> = { path: keyof ModelType, populate?: PopulateConfig[], // TODO it should be possible to get the type from populated field here select?: keyof ModelType } export type PopulateConfigWithoutStringSyntax> = { path: string, populate?: PopulateConfigObj[], select?: string } export type PopulateConfig> = keyof ModelType | PopulateConfigObj export type SortConfig> = Partial> /** EXPOSED means that all what is defined in those variables are allowed to use by the frontend. So no admin configuration should be present */ // rmv const requestConfigPopulateValidatorEXPOSED = { populate: _.typesOr([_.string(), _.object()]) } // rmv export type RequestConfigPopulate> = { populateAsAdmin?: boolean // rmv Should not be present in SDK populate?: PopulateConfig[] } // used to validate at runtime // rmv export const requestConfigReadEXPOSED = { // rmv /** /!\ DO NOT PUT SENSITIVE FIELDS HERE (eg: populateAsAdmin), since it will be exposed and authorized to use in frontend */ // rmv ...requestConfigPopulateValidatorEXPOSED, // rmv filter: _.object(), // rmv page: _.number(), // rmv limit: _.number(), // rmv sort: _.object() // rmv } // rmv export type RequestConfigRead> = RequestConfigShared & RequestConfigPopulate & { filter?: AsFilter page?: number limit?: number sort?: { [k: string]: 1 | -1 } } export const requestConfigWrite = { // rmv ...requestConfigPopulateValidatorEXPOSED, // rmv returnDoc: _.boolean() // rmv } // rmv export type RequestConfigWrite> = RequestConfigShared & RequestConfigPopulate & { returnDoc?: boolean } export const requestConfigGetOne = { // rmv ...requestConfigReadEXPOSED, // rmv triggerErrorIfNotSet: _.boolean() // rmv } // rmv export type RequestConfigGetOne> = RequestConfigShared & RequestConfigRead & { triggerErrorIfNotSet?: boolean } //---------------------------------------- // MONGO BODY //---------------------------------------- type OnlyDotted = { [K in keyof T]: K extends string ? T[K] extends object ? `${K}.${DottedKeys}` : never : never }[keyof T] type DottedKeys = { [K in keyof T]: K extends string ? T[K] extends object ? K | `${K}.${DottedKeys}` : K : never }[keyof T] type ObjectWithDottedPaths> = Partial<{ [K in keyof T]: T[K] extends any[] ? T[K] // [number] : T[K] extends Record ? ObjectWithDottedPaths : T[K] } & { [key in OnlyDotted]: any }> export type AsMongooseBody> = ObjectWithDottedPaths & { $push?: { [K in keyof ObjectWithDottedPaths]: ObjectWithDottedPaths[K] extends any[] ? ObjectWithDottedPaths[K][number] : never }, $pull?: { [K in keyof ObjectWithDottedPaths]: ObjectWithDottedPaths[K] extends any[] ? ObjectWithDottedPaths[K][number] : never }, $inc?: { [K in keyof ObjectWithDottedPaths]: ObjectWithDottedPaths[K] extends number ? ObjectWithDottedPaths[K][number] : never }, } export type PaginationData = { total: number page: number limit: number } export type MaybePaginated< ReturnType extends Array>, Conf extends RequestConfigRead = {} > = Conf['page'] extends number ? PaginationData & { data: ReturnType } : ReturnType //---------------------------------------- // MONGO FILTER //---------------------------------------- // Do not refactor this type type ObjectWithDottedPathsAndArrayAsValueForFilter> = Partial<{ [K in keyof T]: T[K] extends any[] ? MongoFilterValue : T[K] extends Date ? MongoFilterValue : T[K] extends Record ? ObjectWithDottedPathsFilter : MongoFilterValue } & { [key in OnlyDotted]: any }> type ObjectWithDottedPathsFilter> = Partial<{ [K in keyof T]: T[K] extends any[] ? MongoFilterValue // [number] : T[K] extends Date ? MongoFilterValue : T[K] extends Record ? ObjectWithDottedPathsFilter : MongoFilterValue } & { [key in OnlyDotted]: any }> type MongoFilterValue = V | { $ne: V } | { $in: V[] } | (V extends number | Date ? ({ $gte: V } | { $lte: V } | { $gt: V } | { $lt: V }) : never) type FilterObj> = ObjectWithDottedPathsAndArrayAsValueForFilter export type AsFilter> = FilterObj & { $or?: FilterObj[] }