TL;DR
Strapi v3.0.0-beta.16 introduces powerful new features including Repeatable Groups and manyWay relations, along with significant improvements to file uploads and data handling. This release includes breaking changes to core services, bootstrap functions, and hooks, which now use async/await instead of callbacks. The update also addresses numerous bugs related to data types, UI issues, and database interactions across different database systems. Developers should review the migration guide before upgrading as several API changes may require code modifications.
Highlight of the Release
- Introduction of Repeatable Groups for creating complex content structures
- New manyWay relation type for more flexible content modeling
- Support for file uploads via multipart/form-data on generated APIs
- Consistent data handling across different database systems
- Async/await pattern for hooks and bootstrap functions
- Improved UI for editing content with better group field layouts
- Enhanced error messages for unique constraint failures
Migration Guide
Upgrading to v3.0.0-beta.16
Before You Begin
Before upgrading, make sure to:
- Backup your database
- Backup your project files
- Read through all breaking changes
Core Service Changes
Before:
const entry = await strapi.services.article.findOne({ id });
const data = entry.toJSON(); // or entry.toObject() for mongoose
After:
const data = await strapi.services.article.findOne({ id });
// data is already a plain JavaScript object
Bootstrap Function Changes
Before:
module.exports = async (cb) => {
// Do something
cb();
};
After:
module.exports = async () => {
// Do something asynchronously
// No callback needed
};
Hook Changes
Before:
module.exports = strapi => {
return {
initialize: (cb) => {
// Do something
cb();
}
};
};
After:
module.exports = strapi => {
return {
initialize: async () => {
// Do something asynchronously
// No callback needed
}
};
};
WYSIWYG to RichText
If you were using the wysiwyg type, you need to update your models to use richtext instead:
Before:
{
"attributes": {
"content": {
"type": "wysiwyg"
}
}
}
After:
{
"attributes": {
"content": {
"type": "richtext"
}
}
}
File Upload Handling
If you were handling file uploads in your custom controllers:
Before:
const files = ctx.request.body.files;
After:
const files = ctx.request.files;
Admin Panel Rebuild
After upgrading, you'll need to rebuild the admin panel:
npm run build
# or
yarn build
For more detailed information, refer to the official migration guide.
Upgrade Recommendations
Priority: High
This release contains significant new features and important bug fixes that improve the overall stability and functionality of Strapi. The introduction of Repeatable Groups and manyWay relations provides powerful new content modeling capabilities that many users have been requesting.
Who should upgrade immediately:
- Developers who need the new Repeatable Groups feature
- Teams experiencing any of the fixed bugs, especially those related to data handling and UI issues
- Projects in active development that can accommodate breaking changes
Who should wait:
- Production systems that cannot afford downtime without thorough testing
- Projects heavily relying on custom code that interacts with core services, bootstrap functions, or hooks
Upgrade Steps:
- Review the migration guide thoroughly
- Update your code to handle the breaking changes
- Test your application extensively in a staging environment
- Plan for potential downtime during the upgrade process
- Rebuild the admin panel after upgrading
Potential Issues:
Be aware that this release contains several breaking changes that might affect your application, particularly if you have:
- Custom code that relies on the
.toJSON() or .toObject() methods
- Custom bootstrap functions or hooks using callbacks
- Code handling file uploads through the API
- Models using the
wysiwyg type
Overall, the benefits of this release outweigh the migration effort for most users, but proper planning and testing are essential.
Bug Fixes
Data Type and Format Fixes
- Fixed issues with JSON data being sent as strings instead of objects
- Resolved problems with date format errors on MySQL when updating content
- Fixed conversion of long integers to ensure consistent handling across databases
- Addressed issues with enum values containing hyphens
- Improved handling of special characters in attribute names for GraphQL compatibility
- Fixed the ability to store JSON string format in string attributes
UI and Interaction Improvements
- Fixed TypeError: "o is undefined" errors in the frontend
- Resolved issues with the WYSIWYG editor persisting when changing a text field to string
- Fixed crashes when typing into already-filled one-to-one relational dropdowns
- Addressed problems with selecting the first item of an enum when creating objects
- Fixed duplicated relations appearing in relation dropdowns
- Corrected issues with relational field labels not updating
Database and Model Handling
- Fixed issues with unique field types not working properly with Bookshelf
- Resolved problems with renaming columns in SQLite preventing server start
- Fixed the handling of _id vs id with Mongoose, now consistently using id
- Addressed issues with filtering by createdAt/updatedAt
- Fixed problems with content types created in development not working in staging/production
Authentication and Permission Issues
- Fixed confirmed accounts incorrectly receiving "Your account email is not confirmed" messages
- Resolved issues with creating roles named "server"
- Removed resetToken from administrator edit view for security
Content Management Improvements
- Fixed the Content-Manager plugin breaking due to password fields in list view
- Added id option in filters for content manager
- Fixed SSL breaking content manager
- Resolved issues with adding new entries after using generate:api in CLI
New Features
Repeatable Groups
Strapi now supports Repeatable Groups, allowing content creators to define complex, repeatable content structures. This powerful feature enables the creation of flexible content models with nested data structures that can be repeated as needed.
manyWay Relations
A new relation type has been added to provide more flexibility in content modeling. The manyWay relation type allows for more complex relationships between content types.
File Upload in Generated APIs
Generated APIs now support file uploads via multipart/form-data, making it easier to upload files directly through the API without additional configuration.
Customizable Login Logo
Administrators can now customize the logo displayed on the login page, allowing for better branding of the admin interface.
Model Layouts Configuration
Content types can now define their layouts and metadata defaults using Model.config.js(on) files, providing more control over how content is displayed in the admin interface.
UUID Support for MySQL
Added support for UUID fields in MySQL databases through the integration of the bookshelf-uuid package.
ISO Date Format Handling
Dates are now handled in ISO format for both input and output, simplifying date processing across different database systems.
Security Updates
Authentication and Authorization
- Removed resetToken from administrator edit view to prevent potential security issues
- Fixed issues with confirmed accounts incorrectly receiving "Your account email is not confirmed" messages
API Security
- Improved handling of multipart/form-data requests with proper validation
- Enhanced error handling for unique constraint failures to prevent information leakage
- Fixed custom mutation returning null and not executing policies correctly
Data Validation
- Strengthened validation for enum values to prevent injection attacks
- Improved handling of special characters in attribute names to prevent GraphQL vulnerabilities
- Enhanced validation for date inputs to ensure proper formatting
Performance Improvements
Improved Data Handling
- Enhanced date parsing logic across all SQL databases for more consistent performance
- Optimized handling of bigintegers to ensure they're always represented as strings when coming from the database
- Improved mongoose deepfiltering to populate information correctly, enhancing query performance
Frontend Optimizations
- Upgraded React dependencies for better frontend performance
- Improved layout handling to avoid empty rows in edit layouts when not necessary
- Enhanced drag-and-drop functionality for better user experience
Database Interactions
- Optimized unique index handling with cleaner error messages
- Improved handling of relations to prevent unnecessary database queries
- Enhanced support for filtering operations on timestamp fields
Impact Summary
Strapi v3.0.0-beta.16 represents a significant step forward in the platform's evolution, particularly with the introduction of Repeatable Groups and manyWay relations. These features dramatically enhance content modeling capabilities, allowing for more complex and flexible content structures.
The release also brings important standardization to data handling across different database systems. Dates are now consistently handled in ISO format, bigintegers are properly managed as strings when needed, and JSON data is correctly processed. These improvements ensure more predictable behavior regardless of the underlying database.
Breaking changes to core services, bootstrap functions, and hooks reflect Strapi's move toward modern JavaScript practices by embracing async/await patterns instead of callbacks. While this requires code updates, it results in cleaner, more maintainable code.
The UI has received significant attention with improved layouts for editing content, better handling of groups and repeatable fields, and fixes for numerous interaction issues. Administrators will appreciate the ability to customize the login logo and disable help videos completely.
For API consumers, the addition of file upload support via multipart/form-data on generated APIs is a welcome improvement that simplifies integration. The more consistent data formats across different database systems also make API consumption more reliable.
Overall, this release balances new features with important stability improvements and bug fixes, making it a worthwhile upgrade despite the breaking changes. The migration effort is justified by the enhanced capabilities and improved developer experience.
Full Release Notes
Migration guide
You can read the migration guide here
🚀 New feature
- [Framework] Add Repeatable groups (#3664)
- [Framework] Add manyWay relation (#3664)
- [Framework] POST multipart/form-data on generated API for file upload (#3664)
💥 Breaking changes
- [Framework] Core services return data directly (no more .toJSON/ .toObject). (#3664)
- [Framwork] ]Boostrap.js function won't receive a callback anymore (#3664)
- [Framwrok] Hooks are now async. No more callbacks (#3664)
- [Administration] Wysiwyg type changed. Use
richtextnow (#3664)
- [Framework] Koa-body upgrade to 4.0.1. Files are now in
ctx.request.files. (#3664)
🐛 Bug fix
- [Framework] Allow .gitkeep in the plugins folder (#3664)
- [Plugin] Graphql delete on SQL return null (#3664)
- [Plugin] Json sent as string instead of object (#3664)
- [Administration] Unable to create role "server" (#3664)
- [Plugin] Reserved "id" model's field name collision (#3664)
- [Administration] Confirmed account got "Your account email is not confirmed" when login (#3664)
- [Framework] Allow filtering by createdAt/updatedAt (#3664)
- [Framework] WYSIWYG editor stays when changing a text field to string (#3664)
- [Framework] Strapi crahes if you start typing into a one-to-one relational dropdown that is already filled with a relation (#3664)
- [Administration] Add an option to disable the "help" videos and the icon completely (#3664)
- [Administration] Frontend — TypeError: "o is undefined" (#3664)
- [Framework] Dates can't be updated anymore on MySQL (#3664)
- [Administration] Add id option in filter of content manager (#3664)
- [Framework] Can't store array with JSON input (#3664)
- [Administration] Cannot select first item of enum when creating an object with admin (#3664)
- [Plugin] Content-Manager plugin breaks due to password field in list view in production (#3664)
- [Plugin] SSL break content manager (#3664)
- [Framework] Can't store JSON string format in string attribute (#3664)
- [Framework] Date format error on update content manager MySQL (#3664)
- [Framework] Define default attributes for JSON input (#3664)
- [Plugin Frontend — TypeError: "o is undefined" (https://github.com//pull/3664)
- [Framework] Strapi does not properly use Unique field type with Bookshelf (#3664)
- [Framework] Conversion of long integers (#3664)
- [Framework] Replace default
_id by id with Mongoose (#3664)
- [Framework] Enum value with hyphen breaks (#3664)
- [Framework] Special characters from attributes name break GraphQL (#3664)
- [Plugin] Duplicated relations in relation dropdown (#3664)
- [Plugin] Content types created in dev cannot be instantiated in staging & prod after release (#3664)
- [Plugin] Cannot add new entry in UI after generate:api in CLI (#3664)
- [Framework] Rename column in SQLite prevents server start (#3664)
- [Plugin] Enum is way too sensitive (#3664)
- [Plugin] Missing Content-Type header on multipart form causes ugly error (#3664)
- [Administrattion] Unable to edit Strapi favicon or titles (#3664)
- [Plugin] Relational Field Label doesn't update (#3664)