Skip to content

fix(deps): update dependency payload to v3.81.0#946

Open
github-actions[bot] wants to merge 1 commit intomasterfrom
renovate/payload-cms
Open

fix(deps): update dependency payload to v3.81.0#946
github-actions[bot] wants to merge 1 commit intomasterfrom
renovate/payload-cms

Conversation

@github-actions
Copy link
Copy Markdown
Contributor

@github-actions github-actions bot commented Feb 23, 2026

This PR contains the following updates:

Package Type Update Change
payload (source) dependencies minor 3.76.1 -> 3.81.0

Release Notes

payloadcms/payload (payload)

v3.81.0

Compare Source

🚀 Features
  • add LLM eval suite for Payload conventions and code generation (#​15710) (db4b00e)
  • next: prevent admin panel errors when cacheComponents is enabled (#​16020) (1ecd7dd)
🐛 Bug Fixes
🛠 Refactors
📚 Documentation
  • clarify unique field index behavior and add warnings for array/blocks nesting (#​15969) (38c1d4d)
  • document ListViewServerProps/ClientProps and custom list view component patterns (#​15970) (eb3b227)
  • adds code examples for how to fully implement textStateFeature (#​16053) (80ae745)
🧪 Tests
📝 Templates
⚙️ CI
🏡 Chores
  • claude: update audit-dependencies skill with lockfile strategy and override rules (#​16106) (974870a)
  • deps: bump qs-esm from 7.0.2 to 8.0.1 (#​16110) (d6862fe)
🤝 Contributors

v3.80.0

Compare Source

🚀 Features
  • add disableUnique property to the slug field for better multi tenant plugin support (#​15963) (395e1ed)
🐛 Bug Fixes
  • unpublish updates existing version instead of creating a new one (#​15985) (67063ab)
  • use latest draft version data when trashing unpublished documents (#​15981) (57a0edc)
  • db-mongodb: fix pagination with collation in transactions (#​15990) (5c935aa)
  • db-postgres: near query can give incorrect results (#​15907) (843306c)
  • db-sqlite: scheduled publish does not show upcoming events because of wrong nested json querying (#​15911) (3fa834a)
  • deps: resolve high severity audit vulnerabilities (#​15961) (da212fd)
  • drizzle: pagination applied incorrectly when sorting by a field inside an array field (#​15908) (0f67215)
  • drizzle: groups inside localized tabs are not working correctly (#​15936) (57bde77)
  • graphql: force nullable for relationships to avoid errors when the related document is related (#​15915) (560cabe)
  • plugin-mcp: plugin can break next.js request handler because underlying Hono library modifies the global Request object (#​15938) (4cfa495)
  • plugin-multi-tenant: modal container blocks clicks on create-first-user page (#​15973) (8157f4c)
  • richtext-lexical: richtext fields don't respect RTL direction for Arabic and other RTL locales (#​15964) (944a889)
  • ui: defer live preview iframe rendering (#​15999) (9999083)
  • ui: stale data modal shown when onChange starts while save is in-flight (#​15960) (dc98f0f)
📚 Documentation
📝 Templates
⚙️ CI
🏡 Chores
🤝 Contributors

v3.79.1

Compare Source

🐛 Bug Fixes
⚡ Performance
  • richtext-lexical: 3-15x less main thread blocking via centralized toolbar state (#​15832) (2bdf7ce)
📚 Documentation
  • correct type name in editMenuItems client component example (#​15904) (03b20d0)
  • adds req to available args and wraps examples with proper String type conversions in nested-docs (#​15931) (d2a0740)
  • adds docs for logger config (#​15927) (46e43fc)
  • fix links to virtual relationship documentation in both Blocks and Array field documentation (#​15888) (fff60c8)
  • broken anchor link in blocks field table (#​15887) (36c051a)
  • examples: clarify MongoDB prerequisites in Mongo-backed examples (#​15860) (2aa973f)
  • plugin-mcp: updates MCP plugin documentation (#​15729) (b97b4e7)
🧪 Tests
  • adjust total test count to exclude todo tests in summary output (#​15943) (e46daec)
  • fixes pagination and sorting list-view tests due to hydration timing issues (#​15925) (b0f00c4)
  • flaky timeout when clicking Create New button in versions test suite (#​15850) (3fb10e1)
🏡 Chores
🤝 Contributors

v3.79.0

Compare Source

🚀 Features
  • richtext-lexical: separate configuration for lexical block icons (#​15632) (f0498f2)
  • richtext-lexical: upgrade lexical from 0.35.0 to 0.41.0 (#​15760) (ba3bd74)
  • translations: add i18n translations for modular dashboards (#​15004) (cef2838)

Separate Block Icon Configuration (richtext-lexical) — Configure different images for Lexical block icons and block drawer thumbnails independently. Previously, imageURL served both contexts, forcing a compromise between a good 20x20px icon and a good drawer thumbnail. The new images property supports separate icon and thumbnail values with automatic fallback. Fully backwards compatible — imageURL still works but is deprecated. #​15632

image
const QuoteBlock: Block = {
  slug: 'quote',
  images: {
    icon: 'https://example.com/icons/quote-20x20.svg',
    thumbnail: { url: 'https://example.com/thumbnails/quote-480x320.jpg', alt: 'Quote block' },
  },
  fields: [...],
}

Lexical Upgrade 0.35.0 → 0.41.0 (richtext-lexical) — Upgrades the Lexical rich text editor dependency from v0.35.0 to v0.41.0. Includes upstream fixes like normalizeMarkdown (facebook/lexical#7812). All Lexical breaking changes are handled internally by Payload — no action required for standard usage. If you installed lexical manually, update it to 0.41.0 (though using the re-exported versions from @payloadcms/richtext-lexical/lexical/* is recommended). #​15760

Modular Dashboard Translations (translations) — Adds i18n translation support for the Modular Dashboards feature, covering all dashboard widget buttons and error messages. Previously, dashboard UI elements lacked translation keys, making them inaccessible for non-English users. Also updates the automatic translation script to use GPT-4.1 for improved cost efficiency. #​15004

image
🐛 Bug Fixes
  • restoreVersion validation for localized required fields (#​15821) (e899182)
  • draft doc validation when duplicating docs (#​15816) (f470699)
  • plugin-ecommerce: pass req to Payload API calls in Stripe adapter (#​15839) (74799ea)
  • plugin-import-export: automatically inherit locale and limit from URL queries (#​15812) (ee083f0)
  • plugin-import-export: fix imports with locales in a different column order than exported (#​15808) (410912c)
  • plugin-import-export: fix exports in other non-latin scripts being broken when opened in excel (#​15813) (d931894)
  • ui: drag and drop not working for sortable hasMany fields (#​15845) (2c7ef3f)
  • ui: prevent false positive stale data modal on autosave-enabled documents (#​15817) (6aff717)
  • ui: typo in CodeEditor export statement (#​15795) (c5b2a91)
🛠 Refactors
  • rename widget ComponentPath to Component for consistency (#​15780) (f7d0d04)
📚 Documentation
🧪 Tests
  • update suites selected by default in runTestsWithSummary (#​15789) (07f2f05)
🏡 Chores
  • prevent dev server from dirtying tracked files (#​15826) (cb6f426)
  • plugin-search: clean up .DS_Store file and resulting empty images directory (#​14506) (f6f73dd)
⚠️ BREAKING CHANGES
  • rename widget ComponentPath to Component for consistency (#​15780) (f7d0d04)

    • Renames Widget.ComponentPath to Widget.Component and types it as PayloadComponentinstead ofstring`
    • This aligns dashboard widgets with every other component reference in (collections, globals, fields, admin components) - none of them path in the property name, and all of them are typed as PayloadComponent
    • Enables new typescript plugin to work for widget paths (the plugin uses PayloadComponent contextual type detection - string-typed properties were invisible to it)
  • ui: typo in CodeEditor export statement (#​15795) (c5b2a91)

🤝 Contributors

v3.78.0

Compare Source

🚀 Features

Feature Details

TypeScript Plugin for Component Paths - New @payloadcms/typescript-plugin validates PayloadComponent import paths directly in your IDE. It checks that referenced files and exports exist, provides autocomplete for file paths and export names, supports go-to-definition on component path strings, and understands all Payload path conventions including absolute paths, relative paths, tsconfig aliases, and package imports. #​15779

screenshot.2026-02-26.at.15.55.40.mp4
pnpm add -D @​payloadcms/typescript-plugin
{
  "compilerOptions": {
    "plugins": [{ "name": "next" }, { "name": "@​payloadcms/typescript-plugin" }]
  }
}

Trash Out of Beta with Granular Delete Access - Trash is now a stable feature. Delete access control can now distinguish between trashing and permanently deleting — allowing you to permit users to soft-delete documents while restricting permanent deletion to admins. When data.deletedAt is being set, the operation is a trash; otherwise it's a permanent delete. #​15210

import type { CollectionConfig } from 'payload'

export const Posts: CollectionConfig = {
  slug: 'posts',
  trash: true,
  access: {
    delete: ({ req: { user }, data }) => {
      // Not logged in - no access
      if (!user) {
        return false
      }

      // Admins can do anything (trash or permanently delete)
      if (user.roles?.includes('admin')) {
        return true
      }

      // Regular users: check what operation they're attempting
      // If data.deletedAt is being set, it's a trash operation - allow it
      if (data?.deletedAt) {
        return true
      }

      // Otherwise it's a permanent delete - deny for non-admins
      return false
    },
  },
  fields: [
    // ...
  ],
}

Widget Fields (next, ui) - Dashboard widgets can now declare configurable fields, similar to Blocks. Widget data is editable from a new drawer UI when in dashboard editing mode. Full type generation is included — WidgetInstance<T> is generic with typed data and width, and WidgetServerProps is generic so widget components receive typed widgetData. #​15700

Screen.Recording.2026-02-23.at.16.25.40.mov
import { buildConfig } from 'payload'

export default buildConfig({
  admin: {
    dashboard: {
      widgets: [
        {
          slug: 'sales-summary',
          ComponentPath: './components/SalesSummary.tsx#default',
          fields: [
            { name: 'title', type: 'text' },
            {
              name: 'timeframe',
              type: 'select',
              options: ['daily', 'weekly', 'monthly', 'yearly'],
            },
            { name: 'showTrend', type: 'checkbox' },
          ],
          minWidth: 'small',
          maxWidth: 'medium',
        },
      ],
    },
  },
})
import type { WidgetServerProps } from 'payload'

import type { SalesSummaryWidget } from '../payload-types'

export default async function SalesSummaryWidgetComponent({
  widgetData,
}: WidgetServerProps<SalesSummaryWidget>) {
  const title = widgetData?.title ?? 'Sales Summary'
  const timeframe = widgetData?.timeframe ?? 'monthly'

  return (
    <div className="card">
      <h3>
        {title} ({timeframe})
      </h3>
    </div>
  )
}

MCP Plugin Out of Beta (plugin-mcp) - @payloadcms/plugin-mcp is now stable and ready for production use. #​15711

Virtual Field Filtering in MCP (plugin-mcp) - Virtual fields (virtual: true) are now automatically stripped from MCP tool input schemas and filtered from parsed data before create, update, and updateGlobal operations. This prevents non-stored fields from appearing as accepted MCP parameters. #​15680

Markdown Transformer for Upload Nodes (richtext-lexical) - Upload nodes are now properly converted when using convertLexicalToMarkdown. Previously, upload nodes were silently dropped during markdown conversion. Now populated image uploads output ![alt text](/uploads/image.jpg), non-image uploads output link syntax, and non-populated uploads output a reference placeholder so data is never lost. #​15630

Dashed Button Style (ui) - Adds a new dashed button style variant. Also replaces box-shadow with border on all buttons and fixes icon-only button padding. #​15728

Button styles overview

Editable Query Presets from Form View (ui) - Query presets can now be created and edited directly from the document form view using a full WhereBuilder, column picker, and groupBy selector — no longer requiring the list view to build queries first. #​15657

Screen.Recording.2026-02-17.at.18.15.34.mov

🐛 Bug Fixes
  • getFieldsToSign crashes when user missing group/tab fields (#​15775) (9f0c101)
  • improve mobile touch support for dnd (#​15771) (418bb92)
  • prevent silent data overwrites on concurrent edits (#​15749) (7a3f43f)
  • preserve block metadata in mergeLocalizedData and filterDataToSelectedLocales (#​15715) (6557292)
  • return 400 for malformed JSON request bodies (#​15706) (4861fa1)
  • globals not updating updatedAt when saving drafts (#​15764) (df17cb1)
  • return early if pasteURL is not defined (#​15748) (23d52a0)
  • prevent req.file leak between sequential duplicate() calls on upload collections (#​15620) (2baea2e)
  • sanitize filenames in storage adapters (#​15746) (45bd2f1)
  • throw error for unknown query operators (#​15739) (08226db)
  • preserve locale data in unnamed groups with localizeStatus (#​15658) (38b8c68)
  • next: conditionally query snapshot field based on localization (#​15693) (d5706ee)
  • plugin-import-export: update docs on jobs and basic usage as well as visibility (#​15695) (a40210c)
  • plugin-mcp: use inline block schemas in JSON output (#​15675) (a66e844)
  • plugin-multi-tenant: hasMany tenant fields double-wrap arrays in filterOptions (#​15709) (aaddeac)
  • plugin-multi-tenant: return false instead of query when no tenants (#​15679) (f5a5bd8)
  • richtext-lexical: bump acorn to resolve type mismatch with transitive dep (#​15791) (801e851)
  • richtext-lexical: link markdown regex should not match similar looking image markdown (#​15713) (0a0afb0)
  • richtext-lexical: use headingLevel in danish heading label (#​15685) (ad4c0f6)
  • richtext-lexical: strip server-only properties from blocks in lexical client schema map (#​15756) (c05ace2)
  • templates: ecommerce find my order access functionality to use email (#​15736) (b317eaa)
  • ui: array field add button margin not applying consistently (#​15773) (ee298f5)
  • ui: respect custom Cell components on richText fields in list view (#​15762) (139cf3e)
  • ui: use correct translation key for collection version restore modal (#​15757) (c1892eb)
  • ui: encode HTML special characters in version diff view (#​15747) (30fee83)
  • ui: flash of border on list selection buttons (#​15735) (7f3c6c8)
🛠 Refactors
🎨 Styles
  • richtext-lexical: lists and quotes have inconsistent letter spacing (#​15682) (f2397a8)
🧪 Tests
📝 Templates
  • fix cloudflare logger error in with-cloudflare-d1 template (#​15752) (8791a72)
  • ecommerce add missing access control on collections (#​15744) (c74d91d)
  • fix ecommerce webhooks url and update docs on using stripe webhooks (#​15681) (677596c)
🏡 Chores
🤝 Contributors

v3.77.0

Compare Source

🚀 Features

Feature Details

Local API Depth Consistency - The depth option passed to Local API calls like payload.find() is now automatically set on req.query.depth. Previously, hooks relying on req.query.depth would behave differently between Local API and REST/GraphQL calls unless you manually passed req: { query: { depth: x } } in addition to depth: x. This change ensures consistent behavior across all API methods. #​15023

Custom ID Support in db.create (db-*) - New customID argument on payload.db.create allows creating documents with a specific ID without requiring a custom ID field in your collection schema. #​15653

payload.db.create({ collection: 'posts', customID: 'ce98d6c4-c3ab-45de-9dfc-bf33d94cc941', data: { } })

MCP Plugin Migration (plugin-mcp) - Migrates from the deprecated @vercel/mcp-adapter to mcp-handler and bumps @modelcontextprotocol/sdk to 1.25.2 addressing a security vulnerability. Exposes new handler options: disableSse, onEvent, and redisUrl. #​15661

import { mcpPlugin } from '@&#8203;payloadcms/plugin-mcp'

export default buildConfig({
  plugins: [
    mcpPlugin({
      // Optional: Enable SSE transport (disabled by default)
      disableSse: false,
      // Optional: Redis URL for SSE session management (defaults to REDIS_URL env)
      redisUrl: 'redis://localhost:6379',
      // Optional: Track MCP events for analytics/debugging
      onEvent: (event) => {
        console.log('MCP event:', event)
      },
    }),
  ],
})

🐛 Bug Fixes
  • hasMany text fields cannot be filtered with contains operator (#​15671) (4513a05)
  • use consistent empty state styling between list and folder views (#​15555) (8953b37)
  • populate previousValue correctly in afterChange hooks for nested lexical fields (#​15623) (1cc3bb9)
  • add i18n support for dashboard edit mode buttons (#​15564) (818e31d)
  • next: handle undefined fieldTab in version diff tabs (#​15590) (bbacab8)
  • plugin-cloud-storage: ensure file data persists across operations (#​15570) (6af3673)
  • plugin-cloud-storage: generateFileURL only ran when disablePayloadAccessControl was true (#​15667) (6c5611c)
  • plugin-import-export: remove deprecated import (#​15666) (733b1df)
  • plugin-import-export: export and import issues when using custom IDs (#​15518) (7e2a3ab)
  • plugin-import-export: columns being duplicated when using toCSV hook (#​15597) (28e07dc)
  • plugin-mcp: resolve union type fields failing in update tool (#​15660) (9ae89dd)
  • plugin-multi-tenant: improve translation for "Tenant" (use "Mandant" instead of "Mieter") (#​15537) (4d4033b)
  • plugin-multi-tenant: tenant selector not appearing after login (#​15617) (dd09f67)
  • storage-r2: build error due to types issue in R2 Bucket type (#​15670) (7d1e233)
  • ui: fix broken polymorphic join edit drawer (#​15621) (d450e99)
📚 Documentation

Configuration

📅 Schedule: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 Ignore: Close this PR and you won't be reminded about this update again.


  • If you want to rebase/retry this PR, check this box

This PR has been generated by Renovate Bot.

@github-actions github-actions bot force-pushed the renovate/payload-cms branch from 7a57b33 to 6d71bbd Compare February 28, 2026 09:49
@github-actions github-actions bot changed the title fix(deps): update dependency payload to v3.77.0 fix(deps): update dependency payload to v3.78.0 Feb 28, 2026
@github-actions github-actions bot force-pushed the renovate/payload-cms branch 2 times, most recently from 0d3224f to d3cc9ff Compare March 9, 2026 08:45
@github-actions github-actions bot changed the title fix(deps): update dependency payload to v3.78.0 fix(deps): update dependency payload to v3.79.0 Mar 9, 2026
@github-actions github-actions bot force-pushed the renovate/payload-cms branch from d3cc9ff to 1c15a25 Compare March 23, 2026 08:57
@github-actions github-actions bot changed the title fix(deps): update dependency payload to v3.79.0 fix(deps): update dependency payload to v3.80.0 Mar 23, 2026
@github-actions github-actions bot force-pushed the renovate/payload-cms branch from 1c15a25 to c66333f Compare April 6, 2026 09:09
@github-actions github-actions bot changed the title fix(deps): update dependency payload to v3.80.0 fix(deps): update dependency payload to v3.81.0 Apr 6, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants