payload
Version:
Node, React, Headless CMS and Application Framework built on Next.js
558 lines • 19.7 kB
TypeScript
import type { GraphQLInputObjectType, GraphQLNonNull, GraphQLObjectType } from 'graphql';
import type { DeepRequired, IsAny, MarkOptional } from 'ts-essentials';
import type { CustomUpload } from '../../admin/types.js';
import type { Arguments as MeArguments } from '../../auth/operations/me.js';
import type { Arguments as RefreshArguments, Result as RefreshResult } from '../../auth/operations/refresh.js';
import type { Auth, ClientUser, IncomingAuthType } from '../../auth/types.js';
import type { Access, AfterErrorHookArgs, AfterErrorResult, CustomComponent, EditConfig, Endpoint, EntityDescription, EntityDescriptionComponent, GeneratePreviewURL, LabelFunction, LivePreviewConfig, MetaConfig, PayloadComponent, StaticLabel } from '../../config/types.js';
import type { DBIdentifierName } from '../../database/types.js';
import type { Field, FlattenedField, JoinField, RelationshipField, UploadField } from '../../fields/config/types.js';
import type { CollectionSlug, JsonObject, RequestContext, TypedAuthOperations, TypedCollection, TypedCollectionSelect, TypedLocale } from '../../index.js';
import type { PayloadRequest, SelectIncludeType, SelectType, Sort, TransformCollectionWithSelect, Where } from '../../types/index.js';
import type { SanitizedUploadConfig, UploadConfig } from '../../uploads/types.js';
import type { IncomingCollectionVersions, SanitizedCollectionVersions } from '../../versions/types.js';
import type { AfterOperationArg, AfterOperationMap } from '../operations/utils.js';
export type DataFromCollectionSlug<TSlug extends CollectionSlug> = TypedCollection[TSlug];
export type SelectFromCollectionSlug<TSlug extends CollectionSlug> = TypedCollectionSelect[TSlug];
export type AuthOperationsFromCollectionSlug<TSlug extends CollectionSlug> = TypedAuthOperations[TSlug];
export type RequiredDataFromCollection<TData extends JsonObject> = MarkOptional<TData, 'createdAt' | 'id' | 'sizes' | 'updatedAt'>;
export type RequiredDataFromCollectionSlug<TSlug extends CollectionSlug> = RequiredDataFromCollection<DataFromCollectionSlug<TSlug>>;
export type HookOperationType = 'autosave' | 'count' | 'countVersions' | 'create' | 'delete' | 'forgotPassword' | 'login' | 'read' | 'refresh' | 'update';
type CreateOrUpdateOperation = Extract<HookOperationType, 'create' | 'update'>;
export type BeforeOperationHook = (args: {
args?: any;
/** The collection which this hook is being run on */
collection: SanitizedCollectionConfig;
context: RequestContext;
/**
* Hook operation being performed
*/
operation: HookOperationType;
req: PayloadRequest;
}) => any;
export type BeforeValidateHook<T extends TypeWithID = any> = (args: {
/** The collection which this hook is being run on */
collection: SanitizedCollectionConfig;
context: RequestContext;
data?: Partial<T>;
/**
* Hook operation being performed
*/
operation: CreateOrUpdateOperation;
/**
* Original document before change
*
* `undefined` on 'create' operation
*/
originalDoc?: T;
req: PayloadRequest;
}) => any;
export type BeforeChangeHook<T extends TypeWithID = any> = (args: {
/** The collection which this hook is being run on */
collection: SanitizedCollectionConfig;
context: RequestContext;
data: Partial<T>;
/**
* Hook operation being performed
*/
operation: CreateOrUpdateOperation;
/**
* Original document before change
*
* `undefined` on 'create' operation
*/
originalDoc?: T;
req: PayloadRequest;
}) => any;
export type AfterChangeHook<T extends TypeWithID = any> = (args: {
/** The collection which this hook is being run on */
collection: SanitizedCollectionConfig;
context: RequestContext;
doc: T;
/**
* Hook operation being performed
*/
operation: CreateOrUpdateOperation;
previousDoc: T;
req: PayloadRequest;
}) => any;
export type BeforeReadHook<T extends TypeWithID = any> = (args: {
/** The collection which this hook is being run on */
collection: SanitizedCollectionConfig;
context: RequestContext;
doc: T;
query: {
[key: string]: any;
};
req: PayloadRequest;
}) => any;
export type AfterReadHook<T extends TypeWithID = any> = (args: {
/** The collection which this hook is being run on */
collection: SanitizedCollectionConfig;
context: RequestContext;
doc: T;
findMany?: boolean;
query?: {
[key: string]: any;
};
req: PayloadRequest;
}) => any;
export type BeforeDeleteHook = (args: {
/** The collection which this hook is being run on */
collection: SanitizedCollectionConfig;
context: RequestContext;
id: number | string;
req: PayloadRequest;
}) => any;
export type AfterDeleteHook<T extends TypeWithID = any> = (args: {
/** The collection which this hook is being run on */
collection: SanitizedCollectionConfig;
context: RequestContext;
doc: T;
id: number | string;
req: PayloadRequest;
}) => any;
export type AfterOperationHook<TOperationGeneric extends CollectionSlug = string> = (arg: AfterOperationArg<TOperationGeneric>) => Awaited<ReturnType<AfterOperationMap<TOperationGeneric>[keyof AfterOperationMap<TOperationGeneric>]>> | Promise<Awaited<ReturnType<AfterOperationMap<TOperationGeneric>[keyof AfterOperationMap<TOperationGeneric>]>>>;
export type BeforeLoginHook<T extends TypeWithID = any> = (args: {
/** The collection which this hook is being run on */
collection: SanitizedCollectionConfig;
context: RequestContext;
req: PayloadRequest;
user: T;
}) => any;
export type AfterLoginHook<T extends TypeWithID = any> = (args: {
/** The collection which this hook is being run on */
collection: SanitizedCollectionConfig;
context: RequestContext;
req: PayloadRequest;
token: string;
user: T;
}) => any;
export type AfterLogoutHook<T extends TypeWithID = any> = (args: {
/** The collection which this hook is being run on */
collection: SanitizedCollectionConfig;
context: RequestContext;
req: PayloadRequest;
}) => any;
export type AfterMeHook<T extends TypeWithID = any> = (args: {
/** The collection which this hook is being run on */
collection: SanitizedCollectionConfig;
context: RequestContext;
req: PayloadRequest;
response: unknown;
}) => any;
export type RefreshHook<T extends TypeWithID = any> = (args: {
args: RefreshArguments;
user: T;
}) => Promise<RefreshResult | void> | (RefreshResult | void);
export type MeHook<T extends TypeWithID = any> = (args: {
args: MeArguments;
user: T;
}) => ({
exp: number;
user: T;
} | void) | Promise<{
exp: number;
user: T;
} | void>;
export type AfterRefreshHook<T extends TypeWithID = any> = (args: {
/** The collection which this hook is being run on */
collection: SanitizedCollectionConfig;
context: RequestContext;
exp: number;
req: PayloadRequest;
token: string;
}) => any;
export type AfterErrorHook = (args: {
collection: SanitizedCollectionConfig;
} & AfterErrorHookArgs) => AfterErrorResult | Promise<AfterErrorResult>;
export type AfterForgotPasswordHook = (args: {
args?: any;
/** The collection which this hook is being run on */
collection: SanitizedCollectionConfig;
context: RequestContext;
}) => any;
export type BaseListFilter = (args: {
limit: number;
locale?: TypedLocale;
page: number;
req: PayloadRequest;
sort: string;
}) => null | Promise<null | Where> | Where;
export type CollectionAdminOptions = {
baseListFilter?: BaseListFilter;
/**
* Custom admin components
*/
components?: {
afterList?: CustomComponent[];
afterListTable?: CustomComponent[];
beforeList?: CustomComponent[];
beforeListTable?: CustomComponent[];
Description?: EntityDescriptionComponent;
/**
* Components within the edit view
*/
edit?: {
/**
* Replaces the "Preview" button
*/
PreviewButton?: CustomComponent;
/**
* Replaces the "Publish" button
* + drafts must be enabled
*/
PublishButton?: CustomComponent;
/**
* Replaces the "Save" button
* + drafts must be disabled
*/
SaveButton?: CustomComponent;
/**
* Replaces the "Save Draft" button
* + drafts must be enabled
* + autosave must be disabled
*/
SaveDraftButton?: CustomComponent;
/**
* Replaces the "Upload" section
* + upload must be enabled
*/
Upload?: CustomUpload;
};
listMenuItems?: CustomComponent[];
views?: {
/**
* Set to a React component to replace the entire Edit View, including all nested routes.
* Set to an object to replace or modify individual nested routes, or to add new ones.
*/
edit?: EditConfig;
list?: {
actions?: CustomComponent[];
Component?: PayloadComponent;
};
};
};
/** Extension point to add your custom data. Available in server and client. */
custom?: Record<string, any>;
/**
* Default columns to show in list view
*/
defaultColumns?: string[];
/**
* Custom description for collection. This will also be used as JSDoc for the generated types
*/
description?: EntityDescription;
/**
* Disable the Copy To Locale button in the edit document view
* @default false
*/
disableCopyToLocale?: boolean;
enableRichTextLink?: boolean;
enableRichTextRelationship?: boolean;
/**
* Specify a navigational group for collections in the admin sidebar.
* - Provide a string to place the entity in a custom group.
* - Provide a record to define localized group names.
* - Set to `false` to exclude the entity from the sidebar / dashboard without disabling its routes.
*/
group?: false | Record<string, string> | string;
/**
* Exclude the collection from the admin nav and routes
*/
hidden?: ((args: {
user: ClientUser;
}) => boolean) | boolean;
/**
* Hide the API URL within the Edit view
*/
hideAPIURL?: boolean;
/**
* Additional fields to be searched via the full text search
*/
listSearchableFields?: string[];
/**
* Live preview options
*/
livePreview?: LivePreviewConfig;
meta?: MetaConfig;
pagination?: {
defaultLimit?: number;
limits?: number[];
};
/**
* Function to generate custom preview URL
*/
preview?: GeneratePreviewURL;
/**
* Field to use as title in Edit View and first column in List view
*/
useAsTitle?: string;
};
/** Manage all aspects of a data collection */
export type CollectionConfig<TSlug extends CollectionSlug = any> = {
/**
* Do not set this property manually. This is set to true during sanitization, to avoid
* sanitizing the same collection multiple times.
*/
_sanitized?: boolean;
/**
* Access control
*/
access?: {
admin?: ({ req }: {
req: PayloadRequest;
}) => boolean | Promise<boolean>;
create?: Access;
delete?: Access;
read?: Access;
readVersions?: Access;
unlock?: Access;
update?: Access;
};
/**
* Collection admin options
*/
admin?: CollectionAdminOptions;
/**
* Collection login options
*
* Use `true` to enable with default options
*/
auth?: boolean | IncomingAuthType;
/** Extension point to add your custom data. Server only. */
custom?: Record<string, any>;
/**
* Used to override the default naming of the database table or collection with your using a function or string
* @WARNING: If you change this property with existing data, you will need to handle the renaming of the table in your database or by using migrations
*/
dbName?: DBIdentifierName;
defaultPopulate?: IsAny<SelectFromCollectionSlug<TSlug>> extends true ? SelectType : SelectFromCollectionSlug<TSlug>;
/**
* Default field to sort by in collection list view
*/
defaultSort?: Sort;
/**
* When true, do not show the "Duplicate" button while editing documents within this collection and prevent `duplicate` from all APIs
*/
disableDuplicate?: boolean;
/**
* Opt-in to enable query presets for this collection.
* @see https://payloadcms.com/docs/query-presets/overview
*/
enableQueryPresets?: boolean;
/**
* Custom rest api endpoints, set false to disable all rest endpoints for this collection.
*/
endpoints?: false | Omit<Endpoint, 'root'>[];
fields: Field[];
/**
* Specify which fields should be selected always, regardless of the `select` query which can be useful that the field exists for access control / hooks
*/
forceSelect?: IsAny<SelectFromCollectionSlug<TSlug>> extends true ? SelectIncludeType : SelectFromCollectionSlug<TSlug>;
/**
* GraphQL configuration
*/
graphQL?: {
disableMutations?: true;
disableQueries?: true;
pluralName?: string;
singularName?: string;
} | false;
/**
* Hooks to modify Payload functionality
*/
hooks?: {
afterChange?: AfterChangeHook[];
afterDelete?: AfterDeleteHook[];
afterError?: AfterErrorHook[];
afterForgotPassword?: AfterForgotPasswordHook[];
afterLogin?: AfterLoginHook[];
afterLogout?: AfterLogoutHook[];
afterMe?: AfterMeHook[];
afterOperation?: AfterOperationHook<TSlug>[];
afterRead?: AfterReadHook[];
afterRefresh?: AfterRefreshHook[];
beforeChange?: BeforeChangeHook[];
beforeDelete?: BeforeDeleteHook[];
beforeLogin?: BeforeLoginHook[];
beforeOperation?: BeforeOperationHook[];
beforeRead?: BeforeReadHook[];
beforeValidate?: BeforeValidateHook[];
/**
/**
* Use the `me` hook to control the `me` operation.
* Here, you can optionally instruct the me operation to return early,
* and skip its default logic.
*/
me?: MeHook[];
/**
* Use the `refresh` hook to control the refresh operation.
* Here, you can optionally instruct the refresh operation to return early,
* and skip its default logic.
*/
refresh?: RefreshHook[];
};
/**
* Define compound indexes for this collection.
* This can be used to either speed up querying/sorting by 2 or more fields at the same time or
* to ensure uniqueness between several fields.
* Specify field paths
* @example
* [{ unique: true, fields: ['title', 'group.name'] }]
* @default []
*/
indexes?: CompoundIndex[];
/**
* Label configuration
*/
labels?: {
plural?: LabelFunction | StaticLabel;
singular?: LabelFunction | StaticLabel;
};
/**
* Enables / Disables the ability to lock documents while editing
* @default true
*/
lockDocuments?: {
duration: number;
} | false;
/**
* If true, enables custom ordering for the collection, and documents in the listView can be reordered via drag and drop.
* New documents are inserted at the end of the list according to this parameter.
*
* Under the hood, a field with {@link https://observablehq.com/@dgreensp/implementing-fractional-indexing|fractional indexing} is used to optimize inserts and reorderings.
*
* @default false
*
* @experimental There may be frequent breaking changes to this API
*/
orderable?: boolean;
slug: string;
/**
* Add `createdAt` and `updatedAt` fields
*
* @default true
*/
timestamps?: boolean;
/**
* Options used in typescript generation
*/
typescript?: {
/**
* Typescript generation name given to the interface type
*/
interface?: string;
};
/**
* Customize the handling of incoming file uploads
*
* @default false // disable uploads
*/
upload?: boolean | UploadConfig;
/**
* Enable versioning. Set it to true to enable default versions settings,
* or customize versions options by setting the property equal to an object
* containing the version options.
*
* @default false // disable versioning
*/
versions?: boolean | IncomingCollectionVersions;
};
export type SanitizedJoin = {
/**
* The field configuration defining the join
*/
field: JoinField;
getForeignPath?(args: {
locale?: TypedLocale;
}): string;
/**
* The path of the join field in dot notation
*/
joinPath: string;
/**
* `parentIsLocalized` is true if any parent field of the
* field configuration defining the join is localized
*/
parentIsLocalized: boolean;
targetField: RelationshipField | UploadField;
};
export type SanitizedJoins = {
[collectionSlug: string]: SanitizedJoin[];
};
/**
* @todo remove the `DeepRequired` in v4.
* We don't actually guarantee that all properties are set when sanitizing configs.
*/
export interface SanitizedCollectionConfig extends Omit<DeepRequired<CollectionConfig>, 'auth' | 'endpoints' | 'fields' | 'slug' | 'upload' | 'versions'> {
auth: Auth;
endpoints: Endpoint[] | false;
fields: Field[];
/**
* Fields in the database schema structure
* Rows / collapsible / tabs w/o name `fields` merged to top, UIs are excluded
*/
flattenedFields: FlattenedField[];
/**
* Object of collections to join 'Join Fields object keyed by collection
*/
joins: SanitizedJoins;
/**
* List of all polymorphic join fields
*/
polymorphicJoins: SanitizedJoin[];
sanitizedIndexes: SanitizedCompoundIndex[];
slug: CollectionSlug;
upload: SanitizedUploadConfig;
versions: SanitizedCollectionVersions;
}
export type Collection = {
config: SanitizedCollectionConfig;
customIDType?: 'number' | 'text';
graphQL?: {
countType: GraphQLObjectType;
JWT: GraphQLObjectType;
mutationInputType: GraphQLNonNull<any>;
paginatedType: GraphQLObjectType;
type: GraphQLObjectType;
updateMutationInputType: GraphQLNonNull<any>;
versionType: GraphQLObjectType;
whereInputType: GraphQLInputObjectType;
};
};
export type BulkOperationResult<TSlug extends CollectionSlug, TSelect extends SelectType> = {
docs: TransformCollectionWithSelect<TSlug, TSelect>[];
errors: {
id: DataFromCollectionSlug<TSlug>['id'];
message: string;
}[];
};
export type AuthCollection = {
config: SanitizedCollectionConfig;
};
export type TypeWithID = {
docId?: any;
id: number | string;
};
export type TypeWithTimestamps = {
[key: string]: unknown;
createdAt: string;
id: number | string;
updatedAt: string;
};
export type CompoundIndex = {
fields: string[];
unique?: boolean;
};
export type SanitizedCompoundIndex = {
fields: {
field: FlattenedField;
localizedPath: string;
path: string;
pathHasLocalized: boolean;
}[];
unique: boolean;
};
export {};
//# sourceMappingURL=types.d.ts.map