UNPKG

payload

Version:

Node, React, Headless CMS and Application Framework built on Next.js

1,095 lines • 41.8 kB
import type { DefaultTranslationKeys, DefaultTranslationsObject, I18n, I18nClient, I18nOptions, TFunction } from '@payloadcms/translations'; import type { BusboyConfig } from 'busboy'; import type GraphQL from 'graphql'; import type { GraphQLFormattedError } from 'graphql'; import type { JSONSchema4 } from 'json-schema'; import type { Metadata } from 'next'; import type { DestinationStream, Level, pino } from 'pino'; import type React from 'react'; import type { default as sharp } from 'sharp'; import type { DeepRequired } from 'ts-essentials'; import type { RichTextAdapterProvider } from '../admin/RichText.js'; import type { DocumentSubViewTypes, DocumentTabConfig, DocumentViewServerProps, RichTextAdapter } from '../admin/types.js'; import type { AdminViewConfig, ViewTypes, VisibleEntities } from '../admin/views/index.js'; import type { SanitizedPermissions } from '../auth/index.js'; import type { AddToImportMap, ImportMap, Imports, InternalImportMap } from '../bin/generateImportMap/index.js'; import type { Collection, CollectionConfig, SanitizedCollectionConfig } from '../collections/config/types.js'; import type { DatabaseAdapterResult } from '../database/types.js'; import type { EmailAdapter, SendEmailOptions } from '../email/types.js'; import type { ErrorName } from '../errors/types.js'; import type { GlobalConfig, Globals, SanitizedGlobalConfig } from '../globals/config/types.js'; import type { Block, FlattenedBlock, JobsConfig, Payload, RequestContext, TypedUser } from '../index.js'; import type { QueryPreset, QueryPresetConstraints } from '../query-presets/types.js'; import type { PayloadRequest, Where } from '../types/index.js'; import type { PayloadLogger } from '../utilities/logger.js'; /** * The string path pointing to the React component. If one of the generics is `never`, you effectively mark it as a server-only or client-only component. * * If it is `false` an empty component will be rendered. */ export type PayloadComponent<TComponentServerProps extends never | object = Record<string, any>, TComponentClientProps extends never | object = Record<string, any>> = false | RawPayloadComponent<TComponentServerProps, TComponentClientProps> | string; export type RawPayloadComponent<TComponentServerProps extends never | object = Record<string, any>, TComponentClientProps extends never | object = Record<string, any>> = { clientProps?: object | TComponentClientProps; exportName?: string; path: string; serverProps?: object | TComponentServerProps; }; export type PayloadComponentProps<TPayloadComponent> = TPayloadComponent extends RawPayloadComponent<infer TComponentServerProps, infer TComponentClientProps> ? TComponentClientProps | TComponentServerProps : never; export type PayloadClientComponentProps<TPayloadComponent> = TPayloadComponent extends RawPayloadComponent<infer _, infer TComponentClientProps> ? TComponentClientProps : never; export type PayloadServerComponentProps<TPayloadComponent> = TPayloadComponent extends RawPayloadComponent<infer TComponentServerProps, infer _> ? TComponentServerProps : never; export type PayloadReactComponent<TPayloadComponent> = React.FC<PayloadComponentProps<TPayloadComponent>>; export type PayloadClientReactComponent<TPayloadComponent> = TPayloadComponent extends RawPayloadComponent<infer _, infer TComponentClientProps> ? TComponentClientProps extends never ? never : React.FC<TComponentClientProps> : never; export type PayloadServerReactComponent<TPayloadComponent> = TPayloadComponent extends RawPayloadComponent<infer TComponentServerProps, infer _> ? TComponentServerProps extends never ? never : React.FC<TComponentServerProps> : never; export type ResolvedComponent<TComponentServerProps extends never | object, TComponentClientProps extends never | object> = { clientProps?: TComponentClientProps; Component: React.FC<TComponentClientProps | TComponentServerProps>; serverProps?: TComponentServerProps; }; export type BinScriptConfig = { key: string; scriptPath: string; }; export type BinScript = (config: SanitizedConfig) => Promise<void> | void; type Prettify<T> = { [K in keyof T]: T[K]; } & NonNullable<unknown>; export type Plugin = (config: Config) => Config | Promise<Config>; export type LivePreviewConfig = { /** Device breakpoints to use for the `iframe` of the Live Preview window. Options are displayed in the Live Preview toolbar. The `responsive` breakpoint is included by default. */ breakpoints?: { height: number | string; label: string; name: string; width: number | string; }[]; /** The URL of the frontend application. This will be rendered within an `iframe` as its `src`. Payload will send a `window.postMessage()` to this URL with the document data in real-time. The frontend application is responsible for receiving the message and updating the UI accordingly. Use the `useLivePreview` hook to get started in React applications. */ url?: ((args: { collectionConfig?: SanitizedCollectionConfig; data: Record<string, any>; globalConfig?: SanitizedGlobalConfig; locale: Locale; /** * @deprecated * Use `req.payload` instead. This will be removed in the next major version. */ payload: Payload; req: PayloadRequest; }) => Promise<string> | string) | string; }; export type OGImageConfig = { alt?: string; height?: number | string; type?: string; url: string; width?: number | string; }; /** * @todo find a way to remove the deep clone here. * It can probably be removed after the `DeepRequired` from `Config` to `SanitizedConfig` is removed. * Same with `CollectionConfig` to `SanitizedCollectionConfig`. */ type DeepClone<T> = T extends object ? { [K in keyof T]: DeepClone<T[K]>; } : T; export type MetaConfig = { /** * When `static`, a pre-made image will be used for all pages. * When `dynamic`, a unique image will be generated for each page based on page content and given overrides. * When `off`, no Open Graph images will be generated and the `/api/og` endpoint will be disabled. You can still provide custom images using the `openGraph.images` property. * @default 'dynamic' */ defaultOGImageType?: 'dynamic' | 'off' | 'static'; /** * String to append to the auto-generated <title> of admin pages * @example `" - Custom CMS"` */ titleSuffix?: string; } & DeepClone<Metadata>; export type ServerOnlyLivePreviewProperties = keyof Pick<LivePreviewConfig, 'url'>; type GeneratePreviewURLOptions = { locale: string; req: PayloadRequest; token: null | string; }; export type GeneratePreviewURL = (doc: Record<string, unknown>, options: GeneratePreviewURLOptions) => null | Promise<null | string> | string; export type GraphQLInfo = { collections: { [slug: string]: Collection; }; globals: Globals; Mutation: { fields: Record<string, any>; name: string; }; Query: { fields: Record<string, any>; name: string; }; types: { arrayTypes: Record<string, GraphQL.GraphQLType>; blockInputTypes: Record<string, GraphQL.GraphQLInputObjectType>; blockTypes: Record<string, GraphQL.GraphQLObjectType>; fallbackLocaleInputType?: GraphQL.GraphQLEnumType | GraphQL.GraphQLScalarType; groupTypes: Record<string, GraphQL.GraphQLObjectType>; localeInputType?: GraphQL.GraphQLEnumType | GraphQL.GraphQLScalarType; tabTypes: Record<string, GraphQL.GraphQLObjectType>; }; }; export type GraphQLExtension = (graphQL: typeof GraphQL, context: { config: SanitizedConfig; } & GraphQLInfo) => Record<string, unknown>; export type InitOptions = { /** * Sometimes, with the local API, you might need to pass a config file directly, for example, serverless on Vercel * The passed config should match the config file, and if it doesn't, there could be mismatches between the admin UI * and the backend functionality */ config: Promise<SanitizedConfig> | SanitizedConfig; /** * Disable connect to the database on init */ disableDBConnect?: boolean; /** * Disable running of the `onInit` function */ disableOnInit?: boolean; importMap?: ImportMap; /** * A function that is called immediately following startup that receives the Payload instance as it's only argument. */ onInit?: (payload: Payload) => Promise<void> | void; }; /** * This result is calculated on the server * and then sent to the client allowing the dashboard to show accessible data and actions. * * If the result is `true`, the user has access. * If the result is an object, it is interpreted as a MongoDB query. * * @example `{ createdBy: { equals: id } }` * * @example `{ tenant: { in: tenantIds } }` * * @see https://payloadcms.com/docs/access-control/overview */ export type AccessResult = boolean | Where; export type AccessArgs<TData = any> = { /** * The relevant resource that is being accessed. * * `data` is null when a list is requested */ data?: TData; /** ID of the resource being accessed */ id?: number | string; /** If true, the request is for a static file */ isReadingStaticFile?: boolean; /** The original request that requires an access check */ req: PayloadRequest; }; /** * Access function runs on the server * and is sent to the client allowing the dashboard to show accessible data and actions. * * @see https://payloadcms.com/docs/access-control/overview */ export type Access<TData = any> = (args: AccessArgs<TData>) => AccessResult | Promise<AccessResult>; /** Web Request/Response model, but the req has more payload specific properties added to it. */ export type PayloadHandler = (req: PayloadRequest) => Promise<Response> | Response; /** * Docs: https://payloadcms.com/docs/rest-api/overview#custom-endpoints */ export type Endpoint = { /** Extension point to add your custom data. */ custom?: Record<string, any>; /** * Middleware that will be called when the path/method matches * * Compatible with Web Request/Response Model */ handler: PayloadHandler; /** HTTP method (or "all") */ method: 'connect' | 'delete' | 'get' | 'head' | 'options' | 'patch' | 'post' | 'put'; /** * Pattern that should match the path of the incoming request * * Compatible with the Express router */ path: string; /** * Please add "root" routes under the /api folder in the Payload Project. * https://nextjs.org/docs/app/api-reference/file-conventions/route * * @deprecated in 3.0 */ root?: never; }; export type EditViewComponent = PayloadComponent<DocumentViewServerProps>; export type EditViewConfig = { meta?: MetaConfig; } & ({ actions?: CustomComponent[]; } | { Component: EditViewComponent; path?: string; } | { path?: string; /** * Add a new Edit View to the admin panel * i.e. you can render a custom view that has no tab, if desired * Or override a specific properties of an existing one * i.e. you can customize the `Default` view tab label, if desired */ tab?: DocumentTabConfig; }); export type Params = { [key: string]: string | string[] | undefined; }; export type ServerProps = { readonly documentSubViewType?: DocumentSubViewTypes; readonly i18n: I18nClient; readonly locale?: Locale; readonly params?: Params; readonly payload: Payload; readonly permissions?: SanitizedPermissions; readonly searchParams?: Params; readonly user?: TypedUser; readonly viewType?: ViewTypes; readonly visibleEntities?: VisibleEntities; }; export declare const serverProps: (keyof ServerProps)[]; export type Timezone = { label: string; value: string; }; type SupportedTimezonesFn = (args: { defaultTimezones: Timezone[]; }) => Timezone[]; type TimezonesConfig = { /** * The default timezone to use for the admin panel. */ defaultTimezone?: string; /** * Provide your own list of supported timezones for the admin panel * * Values should be IANA timezone names, eg. `America/New_York` * * We use `@date-fns/tz` to handle timezones */ supportedTimezones?: SupportedTimezonesFn | Timezone[]; }; type SanitizedTimezoneConfig = { supportedTimezones: Timezone[]; } & Omit<TimezonesConfig, 'supportedTimezones'>; export type CustomComponent<TAdditionalProps extends object = Record<string, any>> = PayloadComponent<ServerProps & TAdditionalProps, TAdditionalProps>; export type Locale = { /** * value of supported locale * @example "en" */ code: string; /** * Code of another locale to use when reading documents with fallback, if not specified defaultLocale is used */ fallbackLocale?: string; /** * label of supported locale * @example "English" */ label: Record<string, string> | string; /** * if true, defaults textAligmnent on text fields to RTL */ rtl?: boolean; }; export type BaseLocalizationConfig = { /** * Locale for users that have not expressed their preference for a specific locale * @example `"en"` */ defaultLocale: string; /** * Change the locale used by the default Publish button. * If set to `all`, all locales will be published. * If set to `active`, only the locale currently being edited will be published. * The non-default option will be available via the secondary button. * @default 'all' */ defaultLocalePublishOption?: 'active' | 'all'; /** Set to `true` to let missing values in localised fields fall back to the values in `defaultLocale` * * If false, then no requests will fallback unless a fallbackLocale is specified in the request. * @default true */ fallback?: boolean; /** * Define a function to filter the locales made available in Payload admin UI * based on user. */ filterAvailableLocales?: (args: { locales: Locale[]; req: PayloadRequest; }) => Locale[] | Promise<Locale[]>; }; export type LocalizationConfigWithNoLabels = Prettify<{ /** * List of supported locales * @example `["en", "es", "fr", "nl", "de", "jp"]` */ locales: string[]; } & BaseLocalizationConfig>; export type LocalizationConfigWithLabels = Prettify<{ /** * List of supported locales with labels * @example { * label: 'English', * value: 'en', * rtl: false * } */ locales: Locale[]; } & BaseLocalizationConfig>; export type SanitizedLocalizationConfig = Prettify<{ /** * List of supported locales * @example `["en", "es", "fr", "nl", "de", "jp"]` */ localeCodes: string[]; } & LocalizationConfigWithLabels>; /** * @see https://payloadcms.com/docs/configuration/localization#localization */ export type LocalizationConfig = Prettify<LocalizationConfigWithLabels | LocalizationConfigWithNoLabels>; export type LabelFunction<TTranslationKeys = DefaultTranslationKeys> = (args: { i18n: I18nClient; t: TFunction<TTranslationKeys>; }) => string; export type StaticLabel = Record<string, string> | string; export type SharpDependency = (input?: ArrayBuffer | Buffer | Float32Array | Float64Array | Int8Array | Int16Array | Int32Array | string | Uint8Array | Uint8ClampedArray | Uint16Array | Uint32Array, options?: sharp.SharpOptions) => sharp.Sharp; export type CORSConfig = { headers?: string[]; origins: '*' | string[]; }; export type AdminFunction = { args?: object; path: string; type: 'function'; }; export type AdminComponent = { clientProps?: object; path: string; serverProps?: object; type: 'component'; }; export interface AdminDependencies { [key: string]: AdminComponent | AdminFunction; } export type FetchAPIFileUploadOptions = { /** * Returns a HTTP 413 when the file is bigger than the size limit if `true`. * Otherwise, it will add a `truncated = true` to the resulting file structure. * @default false */ abortOnLimit?: boolean | undefined; /** * Automatically creates the directory path specified in `.mv(filePathName)` * @default false */ createParentPath?: boolean | undefined; /** * Turn on/off upload process logging. Can be useful for troubleshooting. * @default false */ debug?: boolean | undefined; /** * User defined limit handler which will be invoked if the file is bigger than configured limits. * @default false */ limitHandler?: ((args: { request: Request; size: number; }) => void) | boolean | undefined; /** * By default, `req.body` and `req.files` are flattened like this: * `{'name': 'John', 'hobbies[0]': 'Cinema', 'hobbies[1]': 'Bike'} * * When this option is enabled they are parsed in order to be nested like this: * `{'name': 'John', 'hobbies': ['Cinema', 'Bike']}` * @default false */ parseNested?: boolean | undefined; /** * Preserves filename extension when using `safeFileNames` option. * If set to `true`, will default to an extension length of `3`. * If set to `number`, this will be the max allowable extension length. * If an extension is smaller than the extension length, it remains untouched. If the extension is longer, * it is shifted. * @default false * * @example * // true * app.use(fileUpload({ safeFileNames: true, preserveExtension: true })); * // myFileName.ext --> myFileName.ext * * @example * // max extension length 2, extension shifted * app.use(fileUpload({ safeFileNames: true, preserveExtension: 2 })); * // myFileName.ext --> myFileNamee.xt */ preserveExtension?: boolean | number | undefined; /** * Response which will be send to client if file size limit exceeded when `abortOnLimit` set to `true`. * @default 'File size limit has been reached' */ responseOnLimit?: string | undefined; /** * Strips characters from the upload's filename. * You can use custom regex to determine what to strip. * If set to `true`, non-alphanumeric characters _except_ dashes and underscores will be stripped. * This option is off by default. * @default false * * @example * // strip slashes from file names * app.use(fileUpload({ safeFileNames: /\\/g })) * * @example * app.use(fileUpload({ safeFileNames: true })) */ safeFileNames?: boolean | RegExp | undefined; /** * Path to store temporary files. * Used along with the `useTempFiles` option. By default this module uses `'tmp'` folder * in the current working directory. * You can use trailing slash, but it is not necessary. * @default './tmp' */ tempFileDir?: string | undefined; /** * This defines how long to wait for data before aborting. Set to `0` if you want to turn off timeout checks. * @default 60_000 */ uploadTimeout?: number | undefined; /** * Applies uri decoding to file names if set `true`. * @default false */ uriDecodeFileNames?: boolean | undefined; /** * By default this module uploads files into RAM. * Setting this option to `true` turns on using temporary files instead of utilising RAM. * This avoids memory overflow issues when uploading large files or in case of uploading * lots of files at same time. * @default false */ useTempFiles?: boolean | undefined; } & Partial<BusboyConfig>; export type ErrorResult = { data?: any; errors: unknown[]; stack?: string; }; export type AfterErrorResult = { graphqlResult?: GraphQLFormattedError; response?: Partial<ErrorResult> & Record<string, unknown>; status?: number; } | void; export type AfterErrorHookArgs = { /** The Collection that the hook is operating on. This will be undefined if the hook is executed from a non-collection endpoint or GraphQL. */ collection?: SanitizedCollectionConfig; /** Custom context passed between hooks */ context: RequestContext; /** The error that occurred. */ error: Error; /** The GraphQL result object, available if the hook is executed within a GraphQL context. */ graphqlResult?: GraphQLFormattedError; /** The Request object containing the currently authenticated user. */ req: PayloadRequest; /** The formatted error result object, available if the hook is executed from a REST context. */ result?: ErrorResult; }; export type AfterErrorHook = (args: AfterErrorHookArgs) => AfterErrorResult | Promise<AfterErrorResult>; /** * This is the central configuration * * @see https://payloadcms.com/docs/configuration/overview */ export type Config = { /** Configure admin dashboard */ admin?: { /** Automatically log in as a user */ autoLogin?: { /** * The email address of the user to login as */ email?: string; /** The password of the user to login as. This is only needed if `prefillOnly` is set to true */ password?: string; /** * If set to true, the login credentials will be prefilled but the user will still need to click the login button. * * @default false */ prefillOnly?: boolean; /** The username of the user to login as */ username?: string; } | false; /** Set account profile picture. Options: gravatar, default or a custom React component. */ avatar?: 'default' | 'gravatar' | { Component: PayloadComponent; }; /** * Add extra and/or replace built-in components with custom components * * @see https://payloadcms.com/docs/admin/custom-components/overview */ components?: { /** * Add custom components to the top right of the Admin Panel */ actions?: CustomComponent[]; /** * Add custom components after the collection overview */ afterDashboard?: CustomComponent[]; /** * Add custom components after the email/password field */ afterLogin?: CustomComponent[]; /** * Add custom components after the navigation links */ afterNavLinks?: CustomComponent[]; /** * Add custom components before the collection overview */ beforeDashboard?: CustomComponent[]; /** * Add custom components before the email/password field */ beforeLogin?: CustomComponent[]; /** * Add custom components before the navigation links */ beforeNavLinks?: CustomComponent[]; /** Replace graphical components */ graphics?: { /** Replace the icon in the navigation */ Icon?: CustomComponent; /** Replace the logo on the login page */ Logo?: CustomComponent; }; /** * Add custom header to top of page globally */ header?: CustomComponent[]; /** Replace logout related components */ logout?: { /** Replace the logout button */ Button?: CustomComponent; }; /** * Replace the navigation with a custom component */ Nav?: CustomComponent; /** * Wrap the admin dashboard in custom context providers */ providers?: PayloadComponent<{ children?: React.ReactNode; }, { children?: React.ReactNode; }>[]; /** * Replace or modify top-level admin routes, or add new ones: * + `Account` - `/admin/account` * + `Dashboard` - `/admin` * + `:path` - `/admin/:path` */ views?: { /** Add custom admin views */ [key: string]: AdminViewConfig; /** Replace the account screen */ account?: AdminViewConfig; /** Replace the admin homepage */ dashboard?: AdminViewConfig; }; }; /** Extension point to add your custom data. Available in server and client. */ custom?: Record<string, any>; /** Global date format that will be used for all dates in the Admin panel. Any valid date-fns format pattern can be used. */ dateFormat?: string; /** * Each entry in this map generates an entry in the importMap. */ dependencies?: AdminDependencies; /** * @deprecated * This option is deprecated and will be removed in v4. * To disable the admin panel itself, delete your `/app/(payload)/admin` directory. * To disable all REST API and GraphQL endpoints, delete your `/app/(payload)/api` directory. * Note: If you've modified the default paths via `admin.routes`, delete those directories instead. */ disable?: boolean; importMap?: { /** * Automatically generate component map during development * @default true */ autoGenerate?: boolean; /** * The base directory for component paths starting with /. * @default process.cwd() **/ baseDir?: string; /** * You can use generators to add custom components to the component import map. * This allows you to import custom components in the admin panel. */ generators?: Array<(props: { addToImportMap: AddToImportMap; baseDir: string; config: SanitizedConfig; importMap: InternalImportMap; imports: Imports; }) => void>; /** * If Payload cannot find the import map file location automatically, * you can manually provide it here. */ importMapFile?: string; }; livePreview?: { collections?: string[]; globals?: string[]; } & LivePreviewConfig; /** Base meta data to use for the Admin Panel. Included properties are titleSuffix, ogImage, and favicon. */ meta?: MetaConfig; routes?: { /** The route for the account page. * * @default '/account' */ account?: `/${string}`; /** The route for the create first user page. * * @default '/create-first-user' */ createFirstUser?: `/${string}`; /** The route for the forgot password page. * * @default '/forgot' */ forgot?: `/${string}`; /** The route the user will be redirected to after being inactive for too long. * * @default '/logout-inactivity' */ inactivity?: `/${string}`; /** The route for the login page. * * @default '/login' */ login?: `/${string}`; /** The route for the logout page. * * @default '/logout' */ logout?: `/${string}`; /** The route for the reset password page. * * @default '/reset' */ reset?: `/${string}`; /** The route for the unauthorized page. * * @default '/unauthorized' */ unauthorized?: `/${string}`; }; /** * Suppresses React hydration mismatch warnings during the hydration of the root <html> tag. * Useful in scenarios where the server-rendered HTML might intentionally differ from the client-rendered DOM. * @default false */ suppressHydrationWarning?: boolean; /** * Restrict the Admin Panel theme to use only one of your choice * * @default 'all' // The theme can be configured by users */ theme?: 'all' | 'dark' | 'light'; /** * Configure timezone related settings for the admin panel. */ timezones?: TimezonesConfig; /** The slug of a Collection that you want to be used to log in to the Admin dashboard. */ user?: string; }; /** * Configure authentication-related Payload-wide settings. */ auth?: { /** * Define which JWT identification methods you'd like to support for Payload's local auth strategy, as well as the order that they're retrieved in. * Defaults to ['JWT', 'Bearer', 'cookie] */ jwtOrder: ('Bearer' | 'cookie' | 'JWT')[]; }; /** Custom Payload bin scripts can be injected via the config. */ bin?: BinScriptConfig[]; blocks?: Block[]; /** * Manage the datamodel of your application * * @see https://payloadcms.com/docs/configuration/collections#collection-configs */ collections?: CollectionConfig[]; /** * Compatibility flags for prior Payload versions */ compatibility?: { /** * By default, Payload will remove the `localized: true` property * from fields if a parent field is localized. Set this property * to `true` only if you have an existing Payload database from pre-3.0 * that you would like to maintain without migrating. This is only * relevant for MongoDB databases. * * @todo Remove in v4 */ allowLocalizedWithinLocalized: true; }; /** * Prefix a string to all cookies that Payload sets. * * @default "payload" */ cookiePrefix?: string; /** Either a whitelist array of URLS to allow CORS requests from, or a wildcard string ('*') to accept incoming requests from any domain. */ cors?: '*' | CORSConfig | string[]; /** A whitelist array of URLs to allow Payload cookies to be accepted from as a form of CSRF protection. */ csrf?: string[]; /** Extension point to add your custom data. Server only. */ custom?: Record<string, any>; /** Pass in a database adapter for use on this project. */ db: DatabaseAdapterResult; /** Enable to expose more detailed error information. */ debug?: boolean; /** * If a user does not specify `depth` while requesting a resource, this depth will be used. * * @see https://payloadcms.com/docs/getting-started/concepts#depth * * @default 2 */ defaultDepth?: number; /** * The maximum allowed depth to be permitted application-wide. This setting helps prevent against malicious queries. * * @default 40000 */ defaultMaxTextLength?: number; /** Default richtext editor to use for richText fields */ editor?: RichTextAdapterProvider<any, any, any>; /** * Email Adapter * * @see https://payloadcms.com/docs/email/overview */ email?: EmailAdapter | Promise<EmailAdapter>; /** Custom REST endpoints */ endpoints?: Endpoint[]; /** * @see https://payloadcms.com/docs/configuration/globals#global-configs */ globals?: GlobalConfig[]; /** * Manage the GraphQL API * * You can add your own GraphQL queries and mutations to Payload, making use of all the types that Payload has defined for you. * * @see https://payloadcms.com/docs/graphql/overview */ graphQL?: { disable?: boolean; disablePlaygroundInProduction?: boolean; maxComplexity?: number; /** * Function that returns an object containing keys to custom GraphQL mutations * * @see https://payloadcms.com/docs/graphql/extending */ mutations?: GraphQLExtension; /** * Function that returns an object containing keys to custom GraphQL queries * * @see https://payloadcms.com/docs/graphql/extending */ queries?: GraphQLExtension; /** * Filepath to write the generated schema to */ schemaOutputFile?: string; /** * Function that returns an array of validation rules to apply to the GraphQL schema * * @see https://payloadcms.com/docs/graphql/overview#custom-validation-rules */ validationRules?: (args: GraphQL.ExecutionArgs) => GraphQL.ValidationRule[]; }; /** * Tap into Payload-wide hooks. * * @see https://payloadcms.com/docs/hooks/overview */ hooks?: { afterError?: AfterErrorHook[]; }; /** i18n config settings */ i18n?: I18nOptions<{} | DefaultTranslationsObject>; /** Automatically index all sortable top-level fields in the database to improve sort performance and add database compatibility for Azure Cosmos and similar. */ indexSortableFields?: boolean; /** * @experimental There may be frequent breaking changes to this API */ jobs?: JobsConfig; /** * Translate your content to different languages/locales. * * @default false // disable localization */ localization?: false | LocalizationConfig; /** * Logger options, logger options with a destination stream, or an instantiated logger instance. * * See Pino Docs for options: https://getpino.io/#/docs/api?id=options * * ```ts * // Logger options only * logger: { * level: 'info', * } * * // Logger options with destination stream * logger: { * options: { * level: 'info', * }, * destination: process.stdout * }, * * // Logger instance * logger: pino({ name: 'my-logger' }) * * ``` */ logger?: 'sync' | { destination?: DestinationStream; options: pino.LoggerOptions; } | PayloadLogger; /** * Override the log level of errors for Payload's error handler or disable logging with `false`. * Levels can be any of the following: 'trace', 'debug', 'info', 'warn', 'error', 'fatal' or false. * * Default levels: * { `* APIError: 'error', `* AuthenticationError: 'error', `* ErrorDeletingFile: 'error', `* FileRetrievalError: 'error', `* FileUploadError: 'error', `* Forbidden: 'info', `* Locked: 'info', `* LockedAuth: 'error', `* MissingFile: 'info', `* NotFound: 'info', `* QueryError: 'error', `* ValidationError: 'info', * } */ loggingLevels?: Partial<Record<ErrorName, false | Level>>; /** * The maximum allowed depth to be permitted application-wide. This setting helps prevent against malicious queries. * * @see https://payloadcms.com/docs/getting-started/concepts#depth * * @default 10 */ maxDepth?: number; /** A function that is called immediately following startup that receives the Payload instance as its only argument. */ onInit?: (payload: Payload) => Promise<void> | void; /** * An array of Payload plugins. * * @see https://payloadcms.com/docs/plugins/overview */ plugins?: Plugin[]; /** * Allow you to save and share filters, columns, and sort orders for your collections. * @see https://payloadcms.com/docs/query-presets/overview */ queryPresets?: { access: { create?: Access<QueryPreset>; delete?: Access<QueryPreset>; read?: Access<QueryPreset>; update?: Access<QueryPreset>; }; constraints: { create?: QueryPresetConstraints; delete?: QueryPresetConstraints; read?: QueryPresetConstraints; update?: QueryPresetConstraints; }; labels?: CollectionConfig['labels']; }; /** Control the routing structure that Payload binds itself to. */ routes?: { /** The route for the admin panel. * @example "/my-admin" * @default "/admin" */ admin?: string; /** @default "/api" */ api?: string; /** @default "/graphql" */ graphQL?: string; /** @default "/graphql-playground" */ graphQLPlayground?: string; }; /** Secure string that Payload will use for any encryption workflows */ secret: string; /** * Define the absolute URL of your app including the protocol, for example `https://example.org`. * No paths allowed, only protocol, domain and (optionally) port. * * @see https://payloadcms.com/docs/configuration/overview#options */ serverURL?: string; /** * Pass in a local copy of Sharp if you'd like to use it. * */ sharp?: SharpDependency; /** Send anonymous telemetry data about general usage. */ telemetry?: boolean; /** Control how typescript interfaces are generated from your collections. */ typescript?: { /** * Automatically generate types during development * @default true */ autoGenerate?: boolean; /** Disable declare block in generated types file */ declare?: { /** * @internal internal use only to allow for multiple declarations within a monorepo and suppress the "Duplicate identifier GeneratedTypes" error * * Adds a @ts-ignore flag above the GeneratedTypes interface declaration * * @default false */ ignoreTSError?: boolean; } | false; /** Filename to write the generated types to */ outputFile?: string; /** * Allows you to modify the base JSON schema that is generated during generate:types. This JSON schema will be used * to generate the TypeScript interfaces. */ schema?: Array<(args: { collectionIDFieldTypes: { [key: string]: 'number' | 'string'; }; config: SanitizedConfig; i18n: I18n; jsonSchema: JSONSchema4; }) => JSONSchema4>; }; /** * Customize the handling of incoming file uploads for collections that have uploads enabled. */ upload?: FetchAPIFileUploadOptions; }; /** * @todo remove the `DeepRequired` in v4. * We don't actually guarantee that all properties are set when sanitizing configs. */ export type SanitizedConfig = { admin: { timezones: SanitizedTimezoneConfig; } & DeepRequired<Config['admin']>; blocks?: FlattenedBlock[]; collections: SanitizedCollectionConfig[]; /** Default richtext editor to use for richText fields */ editor?: RichTextAdapter<any, any, any>; endpoints: Endpoint[]; globals: SanitizedGlobalConfig[]; i18n: Required<I18nOptions>; jobs: JobsConfig; localization: false | SanitizedLocalizationConfig; paths: { config: string; configDir: string; rawConfig: string; }; upload: { /** * Deduped list of adapters used in the project */ adapters: string[]; } & FetchAPIFileUploadOptions; } & Omit<DeepRequired<Config>, 'admin' | 'blocks' | 'collections' | 'editor' | 'endpoint' | 'globals' | 'i18n' | 'localization' | 'upload'>; export type EditConfig = EditConfigWithoutRoot | EditConfigWithRoot; export type EditConfigWithRoot = { api?: never; default?: never; livePreview?: never; /** * Replace or modify _all_ nested document views and routes, including the document header, controls, and tabs. This cannot be used in conjunction with other nested views. * + `root` - `/admin/collections/:collection/:id/**\/*` */ root: Partial<EditViewConfig>; version?: never; versions?: never; }; export type EditConfigWithoutRoot = { [key: string]: EditViewConfig; /** * Replace or modify individual nested routes, or add new ones: * + `default` - `/admin/collections/:collection/:id` * + `api` - `/admin/collections/:collection/:id/api` * + `livePreview` - `/admin/collections/:collection/:id/preview` * + `references` - `/admin/collections/:collection/:id/references` * + `relationships` - `/admin/collections/:collection/:id/relationships` * + `versions` - `/admin/collections/:collection/:id/versions` * + `version` - `/admin/collections/:collection/:id/versions/:version` * + `customView` - `/admin/collections/:collection/:id/:path` * * To override the entire Edit View including all nested views, use the `root` key. */ api?: Partial<EditViewConfig>; default?: Partial<EditViewConfig>; livePreview?: Partial<EditViewConfig>; root?: never; version?: Partial<EditViewConfig>; versions?: Partial<EditViewConfig>; }; export type EntityDescriptionComponent = CustomComponent; export type EntityDescriptionFunction = ({ t }: { t: TFunction; }) => string; export type EntityDescription = EntityDescriptionFunction | Record<string, string> | string; export type { EmailAdapter, SendEmailOptions }; //# sourceMappingURL=types.d.ts.map