Function Signature
export const generateMediaCollection = (
cloudinaryOptions : CloudinaryStorageOptions ,
collectionConfig : Partial < CollectionConfig > = {},
) : CollectionConfig => {
// Returns complete CollectionConfig with Cloudinary fields
};
Overview
The generateMediaCollection function is a utility that creates a fully-configured Payload collection for media storage with Cloudinary. It automatically adds all necessary Cloudinary fields, version history fields, and custom fields.
This function is useful when you want to create a custom Media collection programmatically rather than relying on the plugin to modify existing collections.
Parameters
cloudinaryOptions
CloudinaryStorageOptions
required
Cloudinary configuration options. Used to determine which fields to add (e.g., version fields if versioning is enabled). Cloudinary API credentials.
versioning
CloudinaryVersioningOptions
If enabled: true and storeHistory: true, version history fields will be added to the collection.
Additional custom fields to include in the collection.
collectionConfig
Partial<CollectionConfig>
default: "{}"
Optional partial collection configuration to merge with the generated config. Any fields provided here will override defaults. Collection slug. Defaults to “media” if not provided.
Upload configuration. Will be merged with disableLocalStorage: true.
Additional fields to include. These will be treated as custom fields.
Admin UI configuration. Merged with defaults.
Returns
A complete Payload collection configuration object with:
slug: “media” (or custom slug)
upload: Configured with disableLocalStorage: true
fields: Array containing custom fields, Cloudinary fields, and optional version fields
admin: Configured with description and useAsTitle: "filename"
Generated Fields
The function automatically includes:
Custom fields - From cloudinaryOptions.customFields or collectionConfig.fields
Cloudinary fields - Metadata fields (public_id, secure_url, format, etc.)
Version fields - If versioning.enabled and versioning.storeHistory are both true
Usage Example
Basic Usage
import { buildConfig } from 'payload/config' ;
import { generateMediaCollection } from '@payloadcms/plugin-cloudinary' ;
const cloudinaryOptions = {
config: {
cloud_name: process . env . CLOUDINARY_CLOUD_NAME ! ,
api_key: process . env . CLOUDINARY_API_KEY ! ,
api_secret: process . env . CLOUDINARY_API_SECRET ! ,
},
folder: 'my-app/media' ,
};
export default buildConfig ({
collections: [
generateMediaCollection ( cloudinaryOptions ),
] ,
}) ;
Custom Collection with Additional Fields
import { generateMediaCollection } from '@payloadcms/plugin-cloudinary' ;
const cloudinaryOptions = {
config: {
cloud_name: process . env . CLOUDINARY_CLOUD_NAME ! ,
api_key: process . env . CLOUDINARY_API_KEY ! ,
api_secret: process . env . CLOUDINARY_API_SECRET ! ,
},
versioning: {
enabled: true ,
storeHistory: true ,
},
customFields: [
{
name: 'alt' ,
type: 'text' ,
required: true ,
},
{
name: 'caption' ,
type: 'textarea' ,
},
],
};
const mediaCollection = generateMediaCollection (
cloudinaryOptions ,
{
slug: 'images' ,
admin: {
group: 'Assets' ,
},
},
);
export default buildConfig ({
collections: [ mediaCollection ] ,
}) ;
With Version History
import { generateMediaCollection } from '@payloadcms/plugin-cloudinary' ;
const cloudinaryOptions = {
config: {
cloud_name: process . env . CLOUDINARY_CLOUD_NAME ! ,
api_key: process . env . CLOUDINARY_API_KEY ! ,
api_secret: process . env . CLOUDINARY_API_SECRET ! ,
},
versioning: {
enabled: true ,
storeHistory: true , // This enables version history fields
autoInvalidate: true ,
},
};
const mediaCollection = generateMediaCollection ( cloudinaryOptions );
// Collection now includes 'versions' field for version history
Source Reference
Implementation: ~/workspace/source/src/collections/Media/index.ts:10-46
See Also