import type { UnionToIntersection, LazyLoader, } from '@aws-amplify/data-schema-types'; import type { Authorization, ImpliedAuthFields } from '../Authorization'; import type { ModelField } from '../ModelField'; import type { ModelType, ModelTypeParamShape } from '../ModelType'; import type { GenericModelSchema } from '../ModelSchema'; import type { ModelRelationshipField, ModelRelationshipFieldParamShape, } from '../ModelRelationshipField'; import type { PrimaryIndexIrShape } from '../util/'; import type { ResolveSchema, SchemaTypes } from './ResolveSchema'; import type { InjectImplicitModelFields } from './ImplicitFieldInjector'; import type { ModelIdentifier } from './ModelMetadata'; import type { RefType, RefTypeParamShape } from '../RefType'; import type { NonModelTypesShape } from './ExtractNonModelTypes'; import type { CustomType, CustomTypeParamShape } from '../CustomType'; import type { EnumType } from '../EnumType'; import type { CustomOperation, CustomOperationParamShape, } from '../CustomOperation'; export type ResolveFieldProperties< Schema extends GenericModelSchema, NonModelTypes extends NonModelTypesShape, ResolvedSchema = ResolveSchema, IdentifierMeta extends Record< string, { identifier: PrimaryIndexIrShape } > = ModelIdentifier>, FieldsWithInjectedImplicitFields = InjectImplicitModelFields< ResolvedSchema, IdentifierMeta >, FieldsWithRelationships = ResolveModelsRelationshipAndRefFields< FieldsWithInjectedImplicitFields, NonModelTypes >, > = Intersection< FilterFieldTypes< MarkModelsNonNullableFieldsRequired >, FilterFieldTypes>, FilterFieldTypes> >; export type ResolveStaticFieldProperties< Schema extends GenericModelSchema, NonModelTypes extends NonModelTypesShape, ImplicitModelsSchema, ResolvedSchema = ResolveSchema, FieldsWithInjectedImplicitFields = InjectImplicitModelFields< ResolvedSchema & ImplicitModelsSchema, never >, FieldsWithRelationships = ResolveModelsRelationshipAndRefFields< FieldsWithInjectedImplicitFields, NonModelTypes >, > = Intersection< FilterFieldTypes< MarkModelsNonNullableFieldsRequired >, FilterFieldTypes> >; type GetRelationshipRef< T, RM extends keyof T, TypeArg extends ModelRelationshipFieldParamShape, Flat extends boolean, ResolvedModel = ResolveRelationshipFieldsForModel, Model = TypeArg['valueRequired'] extends true ? ResolvedModel : ResolvedModel | null | undefined, > = LazyLoader; type ResolveRelationshipFieldsForModel< Schema, ModelName extends keyof Schema, Flat extends boolean, > = { [FieldName in keyof Schema[ModelName]]: Schema[ModelName][FieldName] extends ModelRelationshipFieldParamShape ? Schema[ModelName][FieldName]['relatedModel'] extends keyof Schema ? GetRelationshipRef< Schema, Schema[ModelName][FieldName]['relatedModel'], Schema[ModelName][FieldName], Flat > : never : Schema[ModelName][FieldName]; }; // Ref can point to a customType, enum, or custom operation export type ResolveRef< NonModelTypes extends NonModelTypesShape, Ref extends RefTypeParamShape, Link extends string = Ref['link'], RefValue = Link extends keyof NonModelTypes['enums'] ? NonModelTypes['enums'][Link] : Link extends keyof NonModelTypes['customTypes'] ? ResolveRefsOfCustomType< NonModelTypes, NonModelTypes['customTypes'][Link] > : never, Value = Ref['valueRequired'] extends true ? RefValue : RefValue | null, > = ResolveRefValueArrayTraits; /** * Converts the resolved RefType Value type into Array<> according to the * `array` and `arrayRequired` properties of the RefType */ export type ResolveRefValueArrayTraits< Ref extends RefTypeParamShape, Value, > = Ref['array'] extends false ? Value : Ref['arrayRequired'] extends true ? Array : Array | null; export type ResolveRefsOfCustomType< NonModelTypes extends NonModelTypesShape, T, > = { [Prop in keyof T]: T[Prop] extends RefType< infer R extends RefTypeParamShape, any, any > | null ? ResolveRef : T[Prop]; } extends infer Resolved ? ResolveFieldRequirements : never; export type ResolveFieldRequirements = Intersection< ExtractNullableFieldsToOptionalFields, ExtractNonNullableFieldsToRequiredFields >; type ResolveModelsRelationshipAndRefFields< Schema, NonModelTypes extends NonModelTypesShape, Flat extends boolean = false, > = { [ModelProp in keyof Schema]: { [FieldProp in keyof Schema[ModelProp]]: Schema[ModelProp][FieldProp] extends RefType< infer R extends RefTypeParamShape, any, any > | null ? ResolveRef : Schema[ModelProp][FieldProp] extends ModelRelationshipFieldParamShape ? Schema[ModelProp][FieldProp]['relatedModel'] extends keyof Schema ? GetRelationshipRef< Schema, Schema[ModelProp][FieldProp]['relatedModel'], Schema[ModelProp][FieldProp], Flat > : never // if the field value extends ModelRelationshipFieldShape "relatedModel" should always point to a Model (keyof Schema) : Schema[ModelProp][FieldProp]; }; }; type FilterFieldTypes = { [ModelProp in keyof Schema]: { [FieldProp in keyof Schema[ModelProp] as Schema[ModelProp][FieldProp] extends undefined ? never : FieldProp]: Schema[ModelProp][FieldProp]; }; }; type ExtractNullableFieldsToOptionalFields = Partial<{ [FieldProp in keyof Fields as null extends Fields[FieldProp] ? FieldProp : never]: null extends Fields[FieldProp] ? Fields[FieldProp] : never; }>; type MarkModelsNullableFieldsOptional = { [ModelProp in keyof Schema]: ExtractNullableFieldsToOptionalFields< Schema[ModelProp] >; }; type ExtractNonNullableFieldsToRequiredFields = { [FieldProp in keyof Fields as null extends Fields[FieldProp] ? never : FieldProp]: null extends Fields[FieldProp] ? never : Fields[FieldProp]; }; type MarkModelsNonNullableFieldsRequired = { [ModelProp in keyof Schema]: ExtractNonNullableFieldsToRequiredFields< Schema[ModelProp] >; }; type Intersection< A = Record, B = Record, C = Record, D = Record, > = A & B & C & D extends infer U ? { [P in keyof U]: U[P] } : never; // TODO: this should probably happen in InjectImplicitModelFields instead. Keeping here for now to reduce refactor // blast radius export type ModelImpliedAuthFields> = { [ModelKey in keyof Schema['data']['types'] as Schema['data']['types'][ModelKey] extends EnumType ? never : Schema['data']['types'][ModelKey] extends CustomType ? never : Schema['data']['types'][ModelKey] extends CustomOperation< CustomOperationParamShape, any > ? never : ModelKey]: Schema['data']['types'][ModelKey] extends ModelType< infer Model, any > ? AllAuthFieldsForModel : object; }; type AllAuthFieldsForModel< Schema extends GenericModelSchema, Model extends Schema['data']['types'][keyof Schema['data']['types']], > = (Model['authorization'][number] extends never ? Schema['data']['authorization'][number] extends never ? object : ImpliedAuthFields : ImpliedAuthFields) & ImpliedAuthFieldsFromFields; type ImpliedAuthFieldsFromFields = UnionToIntersection< T extends ModelTypeParamShape ? T['fields'][keyof T['fields']] extends | ModelField | ModelRelationshipField | RefType ? Auth extends Authorization ? ImpliedAuthFields : object : object : object >;