Releases: payloadcms/payload
v3.1.0
v3.1.0 (2024-11-22)
🚀 Features
- add skip and force accept flags to migration commands (#8843) (fb3242d)
- richtext-lexical: more powerful custom Block RSCs, improved selection handling (#9422) (9e31e17)
- richtext-lexical: allow customizing maxActiveItems for toolbar groups (#9417) (38de760)
- richtext-lexical: export lexical drawer hooks (#9415) (3b68671)
- templates: update website styles and new home hero image (#9413) (2036a56)
🐛 Bug Fixes
- invalid
payload.collections
type (#9414) (91dcf6d) - unable to load documents with non-standard ids (#9407) (ee1a91e)
- error when opening admin panel without any permissions (#9392) (9470f9b)
- db-postgres: joins with versions and hasMany relationship (#9370) (d499de1)
- live-preview: client-side live preview cannot clear all array rows (#9439) (ae6c71b)
- next: threads server props to custom providers (#9412) (f5683b0)
- next:
next@15.0.3
compatibillity for turbopack warnings patch (#9341) (f2205d1) - richtext-lexical: error when changing block collapsed state in rare cases (#9421) (b9cc4d4)
- richtext-lexical: slash menu from + button did not trigger item select action (#9420) (a891e98)
- richtext-lexical: slash menu query doesn't disappear after selecting slash menu item (#9396) (3d0424b)
- richtext-lexical: preserve indent and text-align when converting Lexical <-> HTML (#9165) (0960290)
- templates: website template breaking change by renaming hero image to jpg (#9416) (18b139b)
- ui: add disabled attribute to blocks drawer toggler (#9424) (27acdae)
- ui: stale server components when rows are moved (#9410) (e3866c4)
- ui: error when collapsing sidebar groups (#9393) (90e37fe)
🤝 Contributors
- Jacob Fletcher (@jacobsfletch)
- Riley Pearce (@rilrom)
- Jessica Chowdhury (@JessChowdhury)
- Germán Jabloñski (@GermanJablo)
- Alessio Gravili (@AlessioGr)
- Paul (@paulpopus)
- Sasha (@r1tsuu)
- Friggo (@MrFriggo)
- Patrik (@PatrikKozak)
- Jarrod Flesch (@JarrodMFlesch)
v3.0.2
v3.0.2 (2024-11-20)
🐛 Bug Fixes
- allow self referencing relationships when adding new collections to config (#9360) (4030e21)
- next: properly sets doc id types when using postgres (#9381) (07a9125)
- next: autosave document rendering (#9364) (9e85be0)
- richtext-lexical: use copy of @lexical/markdown that does not install @lexical/code (#9382) (5db7e1e)
- ui: prioritize server rendered Actions in ActionsProvider (#9379) (439dcd4)
- ui: invalid permissions passed to group and named tab sub-fields (#9366) (c67291d)
- ui: bulk update and delete ignoring search query (#9377) (ef37483)
🤝 Contributors
- Alessio Gravili (@AlessioGr)
- Jacob Fletcher (@jacobsfletch)
- Jarrod Flesch (@JarrodMFlesch)
- Elliot DeNolf (@denolfe)
- Said Akhrarov (@akhrarovsaid)
- Evan Cusack (@cusacke)
- Patrik (@PatrikKozak)
v3.0.1
v3.0.1 (2024-11-19)
⚡ Performance
🐛 Bug Fixes
- allow setting admin path route from config (#8085) (d3b0a04)
- templates: website logo not showing (#9334) (7f65c83)
- templates: seeding in website template moved to a separate route so timeout can be customised (#9327) (26cb1e1)
- ui: could not save selection from upload has many drawer (#9325) (f42b1e1)
- ui: client side doc data not updating after save (#9340) (661f450)
- ui: show required indicator for select fields (#9348) (2c7ea63)
- ui: proper permissions within version diff view (#9346) (188baec)
- ui: addFieldRow set modified (#9324) (0f3f6e7)
🤝 Contributors
- Elliot DeNolf (@denolfe)
- Jarrod Flesch (@JarrodMFlesch)
- Said Akhrarov (@akhrarovsaid)
- Jessica Chowdhury (@JessChowdhury)
- Jacob Fletcher (@jacobsfletch)
- Patrik (@PatrikKozak)
- Marc Maceira (@marcmaceira)
- Paul (@paulpopus)
- James Mikrut (@jmikrut)
- garrettgrohman (@garrettgrohman)
- Sean Zubrickas (@zubricks)
- Alessio Gravili (@AlessioGr)
- Blain Maguire (@BlainMaguire)
v3.0.0
This is a major release that includes a re-architecture of Payload from an Express + React Router SPA to the Next.js App Router + RSCs. In addition to this architectural change, we've also shipped a ton of large features, miscellaneous fixes, and DX improvements.
Architectural changes
- Payload now installs fully in any Next.js app router
- You can now deploy your entire project (frontend and backend) in one app
- Payload can now be deployed serverless on platforms like Vercel
- Everything Payload does now works seamlessly within any Next.js project
- You can now use the Payload Local API in Server Components and Server Functions
- Postgres, Live Preview, and Lexical have been marked as stable
- All Payload exports have been significantly cleaned up and organized
- Payload is now an ESM project
- Payload is now modular, and we now publish new packages
ui
,next
,translations
, andgraphql
- The Payload config is now server-side only, and works in any Node environment
- Server-side HMR works out of the box - removing the need for
nodemon
Large features
- Join field - bi-directional relationships, more control over the database schema, and more
- Select API - select specific fields when querying using Local API
- Jobs Queue - background jobs fully supported in Payload with no third-party dependencies
- Populate / DefaultPopulate API - determine which fields should be retrieved when Payload populates relationships
- Lexical blocks and inline blocks - easily make Payload Blocks available in Lexical as custom rich text features
- SQLite database adapter now available
- Vercel Postgres database adapter released, specifically for serverless deploys on Vercel
- Live Preview server components support
- Admin UI has been refreshed
hasMany
upload fields are now supported- Bulk upload has been added
- Document Locking pattern has been implemented, which shows if someone is currently editing a document
- Ability to publish individual locales one at a time has been added
- Lexical now has Table support
Small but still important features
- New Payload logo (thanks Candycode!)
- New Resend email adapter is now available
- Postgres now saves single, monomorphic relationships directly in a column rather than in
_rels
table - GraphQL has been abstracted into a specific Next.js route handler, and no longer affects Payload initialization at all
- React Compiler has been introduced into Payload build pipeline
- You can now run migrations on init, rather than only in CI (helpful for long-running servers)
- New Local API operations -
count
,countVersions
,countGlobalVersions
,upsert
- Adds
baseListFilter
function to allow enforced list view filters based on user - Lexical fixed toolbar option has been added
- Optimized the way that relational DBs store relations
- Postgres point field is now supported
- Postgres deep JSON querying is now supported
- Cuztomize Drizzle schema by passing in your own, which is handled outside of Payload
- Fully typed i18n
t
function - Focal point data is now stored on uploads
- Adds ability to login with username rather than email
- New pattern for passing custom server / client props to custom components
- Email adapter pattern, including optimized Resend HTTP client
- Reduced / optimized the shape of
/access
permissions results - Allows sorting by multiple fields
- MongoDB now saves ObjectID for relationships
- Adds more control over log level customization
- Downgrades common errors like NotFound or Forbidden to info
- Swaps out
react-toastify
forsonner
- True "virtual" fields via
virtual: true
- Adds ability to customize filenames before upload
- Adds locale indicators to localized field labels
- Scope all payload css to payload-default layer
- Document duplicate / delete from drawers
⚠️ BREAKING CHANGES
This release includes breaking changes. In order to update from version 2 to 3, please review the migration docs.
🤝 Contributors
- James Mikrut (@jmikrut)
- Elliot DeNolf (@denolfe)
- Dan Ribbens (@DanRibbens)
- Said Akhrarov (@akhrarovsaid)
- Germán Jabloñski (@GermanJablo)
- Jarrod Flesch (@JarrodMFlesch)
- Sophia Michelle Andren (@sandren)
- Patrik (@PatrikKozak)
- Nate (@ncaminata)
- mattddean (@mattddean)
- Sasha (@r1tsuu)
- Jacob Fletcher (@jacobsfletch)
- Mikkel Wied Frederiksen (@mikkelwf)
- Alessio Gravili (@AlessioGr)
- Paul (@paulpopus)
- Tobias Odendahl (@tak-amboss)
- Jessica Chowdhury (@JessChowdhury)
- Ruy Monteiro (@ruymon)
- Nathan Clevenger (@nathanclevenger)
- Kendell Joseph (@kendelljoseph)
- Steve (@steventsvetkov)
- Mikkel Madsen (@miguel2650)
- Tylan Davis (@tylandavis)
- Javier (@javierlinked)
- Timothy Choi (@tyteen4a03)
- Andreas Bernhard (@abernh)
- Friggo (@MrFriggo)
- Jesper We (@JesperWe)
- vahacreative (@vahacreative)
- Manuel Leitold (@agrippa1994)
- Gregor Gabrič (@GregorGabric)
- Konsequanzheng (@Konsequanzheng)
- Brandon Kocur (@Brandoko)
- Anders Semb Hermansen (@andershermansen)
- Hristiyan Dodov (@hdodov)
- MotorcycleEnjoyer (@MotorcycleEnjoyer)
- Because789 (@Because789)
- Ante (@azivkovi)
- Mike Bailey (@mykz)
- Riley Pearce (@rilrom)
- Louis Ba (@muyunz)
- gervickas.js (@wellitongervickas)
- Frank Omondi (@Dofften)
- Thành Trang (@trangcongthanh)
- Victor Winberg (@VictorWinberg)
- Florian Quiblier (@fofoy)
- Christoffer Hasselberg (@stofolus)
- Hampus Wallentin Olsen (@hampusolsen)
- Bruno Crosier (@brunocrosier)
- Alexander (@Arctomachine)
- Francisco Lourenço (@franciscolourenco)
- Giuseppe Chiruzzi (@xfloor)
- Ritsu (@r1tsuu)
- Willy Brauner (@willybrauner)
- Michel v. Varendorff (@mvarendorff)
- Lynn Dylan Hurley (@lynndylanhurley)
- Hulpoi George-Valentin (@GeorgeHulpoi)
- Jasper Beaurain (@JasperBeaurain)
- Wilson (@WilsonLe)
- Harley Salas (@HarleySalas)
- Frederic Perron (@FredPerr)
- Viet-Tien (@nvti)
- Patryk Kowalczyk (@Patryk-Kowalczyk)
- Leo Hilsheimer (@linobino1)
- zvizvi (@zvizvi)
- Francis Turmel (@fturmel)
v3.0.0-beta.135
v3.0.0-beta.135 (2024-11-19)
🚀 Features
⚡ Performance
🐛 Bug Fixes
- queues types with
strict: true
(#9281) (e40141b) - nav jumping around if no nav preferences are set (#9301) (0a6f530)
- sanitize sub block field permissions correctly (#9296) (5503afd)
- getPayload node exits on webpack-hmr websocket failure (#9279) (488c28c)
- db-mongodb: potential errors in
sanitizeRelationshipIDs
withref
being a non object (#9292) (665b353) - graphql: loading of polymorphic hasMany relationships (#9175) (0075b99)
- next: passes doc through edit view handler (#9302) (ec95ce8)
- next: passes locale through requests in live preview edit view (#9298) (54ac8b9)
- next: initialize payload with importMap (#9297) (58ac784)
- templates: remove req from seed script (ecbafbf)
- templates: seed from url (#9306) (333da1b)
- ui: safely accesses field in default filter component (#9276) (1a31e63)
⚠️ BREAKING CHANGES
-
removes unnecessary field styles from initial page response (#9286) (30947d2)
This only effects those who are importing Payload's field components
into your own Custom Components or front-end application. Thewidth
prop no longer exists. It has been consolidated into the existing
style
prop. To migrate, simply move this prop as follows:import { TextInput } from '@payloadcms/ui export const MyCustomComponent = () => { return ( <TextInput - width="60%" style={{ + width: "60%, }} /> ) }
🤝 Contributors
- Said Akhrarov (@akhrarovsaid)
- Dan Ribbens (@DanRibbens)
- Elliot DeNolf (@denolfe)
- Germán Jabloñski (@GermanJablo)
- James Mikrut (@jmikrut)
- Sophia Michelle Andren (@sandren)
- Jarrod Flesch (@JarrodMFlesch)
- Patrik (@PatrikKozak)
- Nate (@ncaminata)
- mattddean (@mattddean)
- Sasha (@r1tsuu)
- Jacob Fletcher (@jacobsfletch)
- Mikkel Wied Frederiksen (@mikkelwf)
- Alessio Gravili (@AlessioGr)
v3.0.0-beta.134
v3.0.0-beta.134 (2024-11-17)
🚀 Features
- support relationship writes using objects instead of IDs (#9253) (d21fca9)
- deprecates getPayloadHMR in favor of simpler getPayload (#9249) (31b32ef)
- richtext-lexical: allow replacing entire blocks with custom components (#9234) (63cc966)
⚡ Performance
- richtext-lexical: significantly reduce lexical rerendering and amount of network requests from blocks (#9255) (35917c6)
🐛 Bug Fixes
- proper casing for default root views (#9248) (ed21c1c)
- next: custom default root views (#9247) (c4269d2)
- ui: avoid calling
getTableState
from join field on create (#9256) (ef2475d)
⚠️ BREAKING CHANGES
-
proper casing for default root views (#9248) (ed21c1c)
Custom
account
anddashboard
views now defined as lowercase in the
config.import { buildConfig } from 'payload' const config = buildConfig({ // ... admin: { components: { // ... views: { // ... - Account: ... - Dashboard: ... + account: ... + dashboard: ... }, }, }, })
-
richtext-lexical: significantly reduce lexical rerendering and amount of network requests from blocks (#9255) (35917c6)
The field RSC now provides an initial state for all lexical blocks. This
completely obliterates any flashes and lexical block loading states when
loading or saving a document.This removes the
feature.hooks.load
andfeature.hooks.save
interfaces from custom lexical features, as they weren't used internally
and added unnecessary, additional overhead.If you have custom features that use those, you can migrate to using
normal payload hooks that run on the server instead of the client.
🤝 Contributors
- Sasha (@r1tsuu)
- Alessio Gravili (@AlessioGr)
- Jacob Fletcher (@jacobsfletch)
- Elliot DeNolf (@denolfe)
- James Mikrut (@jmikrut)
v3.0.0-beta.133
v3.0.0-beta.132
v3.0.0-beta.131
v3.0.0-beta.131 (2024-11-15)
🚀 Features
- sanitise access endpoint (#7335) (26ffbca)
- bumps
date-fns
to4.1.0
(#9221) (6845878) - re-order DefaultCellComponentProps generics (#9207) (77c99c2)
- db-mongodb: update mongoose to 8.8.1 (#9115) (7c6f419)
- db-mongodb: support query options in db update operations (#9191) (2d2d020)
- richtext-lexical: add tooltips to toolbar dropdown items (#9218) (7294880)
- richtext-lexical, ui: add icon if link opens in new tab (#9211) (82e72fa)
- storage-uploadthing: upgrade to v7 (#8346) (4690cd8)
⚡ Performance
- removes undefined props from rsc requests (#9195) (2d7626c)
- removes i18n.supportedLanguages from client config (#9209) (5482e7e)
🐛 Bug Fixes
- improve collection / global slugs type-safety in various places (#8311) (810c29b)
- duplicate list preferences stored (#9185) (a5cae07)
- wires up abort controller logic for list columns (#9180) (129fadf)
- ui: jumping hasmany uploads when form is submitting or in readonly mode (#9198) (315b4e5)
- ui: fixes layout shift when form is submitted (#9184) (e6d0443)
⚠️ BREAKING CHANGES
-
db-mongodb: update mongoose to 8.8.1 (#9115) (7c6f419)
MongoDB projects need to run a migration after updating to this beta version, because all relationship IDs are now stored as ObjectID (as they should have always been saved) and we need to migrate your existing relationship data from string-based IDs to ObjectIDs.
To create this migration, run:
pnpm payload migrate:create --file @payloadcms/mongodb/relationships-v2-v3
And then run your migrations using:
pnpm payload migrate
In addition, if your project is heavily relying on using the Mongoose models directly, you may want to review the upgrade guides from v6 to v7 and v7 to v8, making
adjustments as needed. -
improve collection / global slugs type-safety in various places (#8311) (810c29b)
Improves type-safety of collection / global slugs by using
CollectionSlug
/UploadCollectionSlug
andGlobalSlug
types instead ofstring
in these places:
AddsUploadCollectionSlug
andTypedUploadCollection
utility typesThis also changes how we suggest to add an upload collection to a cloud-storage adapter:
Before:azureStorage({ collections: { [Media.slug]: true, }, })
After:
azureStorage({ collections: { media: true, }, })
-
re-order DefaultCellComponentProps generics (#9207) (77c99c2)
Changes the order of the
DefaultCellComponentProps
generic type,
allowing us to infer the type of cellData when a ClientField type is
passed as the first generic argument. You can override the cellData type
by passing the second generic.Previously:
type DefaultCellComponentProps<TCellData = any, TField extends ClientField = ClientField>
New:
type DefaultCellComponentProps<TField extends ClientField = ClientField, TCellData = undefined>
You can override the cellData type by passing in the second argument
to the generic. ie if you know the shape of your data differs than the
inferred type then you can do something like:DefaultCellComponentProps<RelationshipFieldClient, { myShape: string, here: string }>
-
storage-uploadthing: upgrade to v7 (#8346) (4690cd8)
Upgrade uploadthing to v7
The
options
that can be passed to the plugin now mirror the
UTApiOptions
of v7.The most notable change is to pass
token
with
process.env.UPLOADTHING_TOKEN
instead ofapiKey
with
process.env.UPLOADTHING_SECRET
.options: { - apiKey: process.env.UPLOADTHING_SECRET, + token: process.env.UPLOADTHING_TOKEN, acl: 'public-read', },
v3.0.0-beta.130
v3.0.0-beta.130 (2024-11-13)
🚀 Features
- adds ability to define base filter for list view (#9177) (9da8543)
- customize log levels and downgrade common errors to info (#9156) (d628222)
- next: initializes nav group prefs on the server and consolidates records (#9145) (f6bdc0a)
- templates: update config structure in website template to be more clear (#9161) (5ac4e73)
🐛 Bug Fixes
- add inline <style> to ensure the order of declared css layers as much as possible (#9123) (cd95daf)
- fallbackLocale not respecting default settings, locale specific fallbacks and not respecting 'none' or false (#8591) (f4d526d)
- expose server and client props to custom list slot components (#9159) (a8e3095)
- db-postgres: create relationship-v2-v3 migration (#9178) (5b9cee6)
- next: safely check for
state
when creating first user (#9168) (3b55458)
🤝 Contributors
- Sasha (@r1tsuu)
- Jarrod Flesch (@JarrodMFlesch)
- Paul (@paulpopus)
- James Mikrut (@jmikrut)
- Patrik (@PatrikKozak)
- Dan Ribbens (@DanRibbens)
- Elliot DeNolf (@denolfe)
- Jacob Fletcher (@jacobsfletch)