Skip to main content

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).
collectionConfig
Partial<CollectionConfig>
default:"{}"
Optional partial collection configuration to merge with the generated config. Any fields provided here will override defaults.

Returns

CollectionConfig
CollectionConfig
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:
  1. Custom fields - From cloudinaryOptions.customFields or collectionConfig.fields
  2. Cloudinary fields - Metadata fields (public_id, secure_url, format, etc.)
  3. 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

Build docs developers (and LLMs) love