import { DirectiveLocation, OperationDefinitionNode } from 'graphql'; import { FieldOptions } from './decorators'; import { HookRegister } from './hook-manager'; import { AdminUIFilterType, BackendProvider, CreateOrUpdateHookParams, DeleteManyHookParams, FieldMetadata, Filter, GetTypeFunction, ReadHookParams, Resolver, Sort } from './types'; export type EntityHookFunctionCreateOrUpdate = (params: CreateOrUpdateHookParams) => Promise> | Partial; export type EntityHookFunctionDelete = (params: DeleteManyHookParams) => Promise> | Partial; export type EntityHookFunctionRead = (params: ReadHookParams) => Promise> | Partial; export interface HookRegistration { [HookRegister.BEFORE_CREATE]?: EntityHookFunctionCreateOrUpdate[]; [HookRegister.AFTER_CREATE]?: EntityHookFunctionCreateOrUpdate[]; [HookRegister.BEFORE_UPDATE]?: EntityHookFunctionCreateOrUpdate[]; [HookRegister.AFTER_UPDATE]?: EntityHookFunctionCreateOrUpdate[]; [HookRegister.BEFORE_DELETE]?: EntityHookFunctionDelete[]; [HookRegister.AFTER_DELETE]?: EntityHookFunctionDelete[]; [HookRegister.BEFORE_READ]?: EntityHookFunctionRead[]; [HookRegister.AFTER_READ]?: EntityHookFunctionRead[]; } export interface EntityMetadata { type: 'entity'; name: string; description?: string; plural: string; target: { new (...args: any[]): G; }; provider?: BackendProvider; fields: { [key: string]: FieldMetadata; }; directives?: Record; hooks?: HookRegistration; primaryKeyField?: keyof G; apiOptions?: { clientGeneratedPrimaryKeys?: boolean; excludeFromBuiltInOperations?: boolean; excludeFromBuiltInWriteOperations?: boolean; excludeFromFiltering?: boolean; excludeFromTracing?: boolean; namespaceForFederation?: boolean; resolvableViaFederation?: boolean; excludeFromFederation?: boolean; }; adminUIOptions?: { defaultFilter?: Filter; defaultSort?: Partial>; exportPageSize?: number; hideInSideBar?: boolean; hideInFilterBar?: boolean; hideInDetailForm?: boolean; summaryField?: Extract; readonly?: boolean; fieldForDetailPanelNavigationId?: Extract; filterType?: AdminUIFilterType; }; graphweaverInternalOptions?: { ignoreReservedEntityNames?: boolean; }; } export declare function isInputMetadata(value: unknown): value is InputTypeMetadata; export declare function isEntityMetadata(value: unknown): value is EntityMetadata; export interface EnumMetadata { type: 'enum'; target: object; name: string; description?: string; valuesConfig?: EnumValuesConfig; } export declare function isEnumMetadata(value: unknown): value is EnumMetadata; export type EnumValuesConfig = Partial>; export interface InputTypeMetadata { type: 'inputType'; name: string; description?: string; fields: { [key: string]: FieldMetadata; }; target: G; } export type CollectEnumInformationArgs = Omit, 'type'>; export type CollectEntityInformationArgs = Omit, 'type' | 'fields'>; export type CollectInputTypeInformationArgs = Omit, 'type' | 'fields'>; export interface ArgMetadata { type: GetTypeFunction; description?: string; defaultValue?: unknown; deprecationReason?: string; nullable?: boolean; } export declare function isArgMetadata(value: unknown): value is ArgMetadata; export interface ArgsMetadata { [key: string]: ArgMetadata | GetTypeFunction; } export interface DirectiveMetadata { name: string; type: 'directive'; description?: string; args?: ArgsMetadata; isRepeatable?: boolean; locations: DirectiveLocation[]; } export type CollectDirectiveTypeInformationArgs = Omit; export declare function isUnionMetadata(value: unknown): value is UnionMetadata; export interface UnionMetadata { name: string; type: 'union'; target: object; description?: string; getTypes: GetTypeFunction; } type VariableValues = { [name: string]: any; }; export type CollectUnionTypeInformationArgs = Omit; export interface LogOnDidResolveOperationParams { ast: OperationDefinitionNode; variables: VariableValues | undefined; } export interface LogOnDidResolveOperationResponse { query: string; variables: VariableValues | undefined; } export interface AdditionalOperationInformation { name: string; getType: () => any; resolver: Resolver; directives?: Record; args?: ArgsMetadata; description?: string; /** * Optional function to override the default logging of the operation. * This allows you to change the log message, perhaps to obfuscate sensitive data, or to add additional context. * This log gets printed at `didResolveOperation` of the Apollo lifecycle. * For more information of the lifecycle see https://www.apollographql.com/docs/apollo-server/integrations/plugins-event-reference#didresolveoperation * @param params The query as AST and the variables as an object * @returns the query and variables to log. Internally Graphweaver does something like `logger.info(logOnDidResolveOperation(params))` */ logOnDidResolveOperation?: (params: Readonly) => LogOnDidResolveOperationResponse; } export type MetadataType = EntityMetadata | EnumMetadata | InputTypeMetadata | DirectiveMetadata | UnionMetadata; declare class Metadata { private metadataByType; private nameLookupCache; private typeByDataEntityLookup; private additionalQueriesLookup; private additionalMutationsLookup; private entityDecoratorCallLog; federationSubgraphName?: string; private ensureNameLookupCachePopulated; collectEntityInformation(args: CollectEntityInformationArgs): void; collectProviderInformationForEntity(args: { provider: BackendProvider; target: any; }): void; collectFieldInformation(args: FieldOptions & Pick, 'target' | 'name' | 'getType' | 'relationshipInfo'>): void; collectEnumInformation(args: CollectEnumInformationArgs): void; collectInputTypeInformation(args: CollectInputTypeInformationArgs): void; collectDirectiveTypeInformation(args: CollectDirectiveTypeInformationArgs): void; collectUnionTypeInformation(args: CollectUnionTypeInformationArgs): {}; entities(): Generator, void, unknown>; entityNames(): Generator; enums(): Generator, void, unknown>; inputTypes(): Generator, void, unknown>; additionalQueries(): Generator; additionalMutations(): Generator; directives(): Generator; hasName(name: string): boolean; getTypeForName(name: string): MetadataType | undefined; metadataForType(type: unknown): MetadataType | undefined; hasEntity(type: unknown): boolean; hasEnum(type: unknown): boolean; hasInputType(type: unknown): boolean; getEntityMetadataByDataEntity(dataEntityClass: unknown): EntityMetadata | undefined; get typeCounts(): { entity: number; enum: number; inputType: number; directive: number; union: number; }; getEntityByName(name: string): EntityMetadata | undefined; getEnumByName(name: string): EnumMetadata | undefined; getInputTypeByName(name: string): InputTypeMetadata | undefined; getAdditionalQueryByName(name: string): AdditionalOperationInformation | undefined; getAdditionalMutationByName(name: string): AdditionalOperationInformation | undefined; nameForObjectType(type: unknown): string | undefined; primaryKeyFieldForEntity(entity: EntityMetadata): string; fieldMetadataForFilterKey(entity: EntityMetadata, filterKey: string): FieldMetadata | undefined; addQuery(args: AdditionalOperationInformation & { intentionalOverride?: boolean; }): void; addMutation(args: AdditionalOperationInformation & { intentionalOverride?: boolean; }): void; federationNameForEntity(entity: EntityMetadata): string; federationNameForGraphQLTypeName(name: string): string; clear(): void; readonly validateEntities: () => void; } export declare const graphweaverMetadata: Metadata; export {};