Skip to content

Releases: medusajs/medusa

v1.17.3

01 Nov 07:38
Compare
Choose a tag to compare

Highlights

API Routes compatible with Windows

An issue with path parsing on Windows for API Routes registration has been resolved (#5497).

Custom batch jobs support in Admin activity drawer

Custom batch jobs can now be rendered in the activity drawer in Medusa Admin (#5288)

Use format [entity]-[operation] for your batch job type to render a human-readable activity title. For example, product-import.

Translations

Vietnamese, Ukrainian, Tamil, Russian, and Hindi translations added to Medusa Admin.

Removed source-map-plugin from @medusajs/admin-ui

Removed source-map-plugin to make Webpack more fault tolerant. The plugin would cause admin builds to throw if a dependency had no source maps (#5484)

Features

Bugs

  • fix(orchestration): field alias should represent the isList in the result by @adrien2p in #5449
  • fix(admin-ui): fix analytics config not being saved in invite form by @shahednasser in #5467
  • fix(medusa): totals calculation with gift card by @adrien2p in #5075
  • fix(medusa): Revert status type in API by @olivermrbl in #5428
  • fix(admin-ui): PriceList bulk editor fixes by @kasperkristensen in #5456
  • fix(medusa, modules-sdk, modules): Module loading missing dependencies + remote query reference issue by @adrien2p in #5468
  • fix(admin-ui): modify webpack config to prevent throwing sourcemap errors by @kasperkristensen in #5484
  • fix(admin-ui): TIP in shipping option creation by @olivermrbl in #5356
  • fix(medusa): admin get product should return prices when expected by @adrien2p in #5480
  • fix(medusa): Add admin get product tests by @adrien2p in #5480
  • fix(medusa): Add inventory decoration for cart endpoints by @pKorsholm in #5187
  • fix(admin-ui) Custom batch job activity card by @pepijn-vanvlaanderen in #5288
  • fix(admin-ui): Enhanced 'activity-drawer' visibility with z-index adjustment by @ram-you in #5315
  • fix(medusa): Make file based routing compatible with Windows pathing by @kasperkristensen in #5497

Chores

  • chore(oas): update order OAS schema to include new fields by @shahednasser in #5436
  • chore(oas): Fix OAS related to JWT authentication by @shahednasser in #5448
  • chore(docs): Removed Docs Announcement Bar (automated) by @github-actions in #5466
  • chore(docs-util): Improve generate references script and action by @shahednasser in #5472

Documentation

New Contributors

Full Changelog: v1.17.2...v1.17.3

v1.17.2

19 Oct 14:05
Compare
Choose a tag to compare

Highlights

API Routes

Version 1.17.2 of @medusajs/medusa introduces API Routes - a massive improvement of the developer experience of creating custom endpoints in Medusa.

Custom API endpoints can now be implemented using similar patterns to frameworks like Next.js and Svelte.

// api/admin/products/route.ts

import { MedusaRequest, MedusaResponse } from "@medusajs/medusa"

export async function GET(req: MedusaRequest, res: MedusaResponse) {
  const productService = req.scope.resolve("productService")
  const products = await productService.list()
  res.json({ products })
}

In the above example, we create the endpoint GET /admin/products. The example illustrates a few key points:

  • Endpoint paths are inferred from the file path of the route
  • route.{ts|js} is a new special file that contains the route handlers
  • HTTP methods of route handlers are defined by the handler name (above GET)

Read more about the API Routes in the PR and announcement post.

Features

  • feat(medusa): support file based routing by @kasperkristensen in #5365
  • feat(create-medusa-app): add tracking for selected options by @shahednasser in #5404
  • feat(medusa): add pricing integration feature flag by @pKorsholm in #5287
  • feat(link-modules,modules-sdk,pricing): Medusa App Migrations + Core compatible migrations by @riqwan in #5317
  • feat(pricing,types,utils): Move calculate pricing query to a repository + rule type validation by @riqwan in #5294
  • feat(medusa-file-s3): Added S3 directory config by @pepijn-vanvlaanderen in #5291
  • feat: move create inventory to @medusajs/workflows by @srindom in #5301
  • feat(workflows): update product workflow by @fPolic in #4982

Bugs

Chores

Docs

Full Changelog: v1.17.1...v1.17.2

v1.17.1

06 Oct 15:47
Compare
Choose a tag to compare

Highlights

Pricing UI + UX upgrade

The Price List domain in @medusajs/admin has been revamped to improve merchants' experience in creating promotional sales and customer-specific prices.

The update includes:

  • New UI implemented using Medusa UI
  • Bulk Editor for editing multiple prices on the Products part of the Price List
price-list-editor.mp4

We will incrementally migrate Medusa Admin to use our UI components library. Therefore, you can expect to find UI inconsistencies in the foreseeable future.

The next iteration of the Price List revamp will introduce minimum and maximum requirements support (in the UI), as well as the ability to import and export Price List to/from CSV files.

AI Assistant

We've introduced an AI Assistant to our documentation, helping you on your journey building digital commerce experiences.

Screen.Recording.2023-10-05.at.10.40.10.AM.mov

Added translations

Spanish, Italian, and German translations have been added to Medusa Admin.

Features

Bugs

Documentation

New Contributors

Full Changelog: v1.17.0...v1.17.1

v1.17.0

29 Sep 18:35
Compare
Choose a tag to compare

Highlights

New and improved authentication methods

Version 1.17.0 of @medusajs/medusa ships new and improved authentication methods. A contribution by @dPreininger.

Medusa supports three authentication methods:

Sessions
Our session cookie authentication remains unchanged. However, the strategy name has been updated in both the store and admin API, making existing cookie sessions invalid.

⚠️ We will not convert existing sessions to work with this update. Make sure to plan your upgrade accordingly.

API tokens (⚠️ breaking changes)

The header for API token authentication has changed from a Bearer authorization scheme to a custom header scheme specific to Medusa, x-medusa-access-token.

Previously, you would use API tokens like so:

curl -L GET '<BACKEND_URL>/admin/products' \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer {api_token}'

This has changed to:

curl -L GET '<BACKEND_URL>/admin/products' \
  -H 'Content-Type: application/json' \
  -H 'x-medusa-access-token: {api_token}'

Bearer tokens
Bearer token authentication is a "new" method that utilizes JWT tokens and the Bearer scheme. Request a token from a client and attach it to subsequent requests to keep the authenticated session alive. The approach is identical to that of the old API authentication but uses a different token type.

First, request a token:

curl -L POST 'http://localhost:9000/admin/auth/token' \
  -H 'Content-Type: application/json' \
  --data-raw '{
    "email": "[email protected]",
    "password": "supersecret"
  }'

Then, hit an authenticated route:

curl -L GET 'http://localhost:9000/admin/products?limit=1' \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer some_access_token'

Arabic translations

Thanks to @PeterAbdalla, you can now operate Medusa Admin in Arabic.

Medusa UI 2.0

Version 2.0 of @medusajs/ui is out. To upgrade, run the following command in your project:

yarn add @medusajs/[email protected]

The release includes:

  • New components, including CurrencyInput, Tabs, and CommandBar
  • New icons
  • Updated API of Button, Badge, and CodeBlock (⚠️ breaking changes)

And much more.

Check out all changes and the upgrade guide in our documentation: https://docs.medusajs.com/upgrade-guides

Features

  • feat(utils): Provide an utils that allows to convert an array of fields to a complete remote query object by @adrien2p in #5161
  • feat(medusa): Migrate remote query usage in store product domain to use an object by @adrien2p in #5131
  • feat(medusa): Admin get product with isolated module by @adrien2p in #5054
  • feat(medusa): Admin list product with product isolated module by @adrien2p in #5046
  • feat(medusa): Remove create product unnecessary input config workflow by @adrien2p in #5196
  • feat(medusa): Authentication overhaul by @dPreininger in #4064
  • feat(pricing): add price rule entity by @pKorsholm in #5050
  • feat(medusa): Add product isolation FF to update cart by @adrien2p in #5168
  • feat(admin-ui): Add Arabic translations by @PeterAbdalla in #5140
  • feat(pricing, types, utils): Exact match based on context + fallback on rule priority if not by @riqwan in #5214

Bugs

Chores

Documentation

New Contributors

Full Changelog: v1.16.1...v1.17.0

v1.16.1

21 Sep 07:32
Compare
Choose a tag to compare

Highlights

Polish translations added to Medusa Admin

Huge thanks to @chemicalkosek for the contribution!

Important bugs related to Multi-language support resolved

Upgrade to the latest version of Medusa Admin:

yarn add @medusajs/admin@latest

Solves:

Features

Bugs

Documentation

New Contributors

Full Changelog: v1.16.0...v1.16.1

v1.16.0

15 Sep 15:16
223a4a4
Compare
Choose a tag to compare

Highlights

Multi-language support in Medusa Admin

We are excited to announce multi-language support in Medusa Admin, allowing merchants to manage products, orders, customers, etc. in their preferred language.

This release ships English, Portuguese (Brazil), and French translations.

Check it out by upgrading to the latest version of Medusa Admin:

yarn add @medusajs/admin@latest

Huge thanks to @gempain and @mj-mehdizadeh for this amazing contribution. And thanks @dahorarodrigo for contributing with Portuguese translations.

If you want to help us translate Admin to other languages, see the contribution guide in our documentation.

Your efforts are highly appreciated!

Pricing Module

This release introduces the first iteration of our new standalone Pricing Module, which ships on npm under @medusajs/pricing. This version of the module comes with limited functionality as we've focused on putting down a solid foundation for follow-up work.

You can think of the Pricing Module as a way to assign a price to any type of resource, for example, ProductVariants.

We will share an announcement article soon, describing the module's features and what you can expect from follow-up iterations.

Breaking changes

Database schema changes
In our effort to build Standalone Commerce Modules, we will incrementally be dropping foreign key constraints across many business domains and change relationships between entities in the core, @medusajs/medusa.

Right now, we are focused on finalizing the Product (@medusajs/product) and Pricing (@medusajs/pricing) module, which has led to the following database changes.

The relationship between MoneyAmounts and ProductVariants has been changed from a Many-to-One to a Many-to-Many in package @medusajs/medusa. Therefore, you are required to apply the new migration by running the following command in your Medusa project:

npx @medusajs/medusa-cli migrations run

You can no longer create prices for variants as part of creating a product using only the ProductService.

await ProductService.create({ variants [ { prices: [ ... ] } ] }) // <-- This will throw an error, due to the change in DB schema mentioned above 

Instead, you should create products and variants separately. For example, you can do:

const product = await ProductService.create({ ... })

const variants = await ProductVariantService.create(product.id, variants)

Additionally, the following foreign key constraints have been dropped:

These changes are only relevant if you are using the feature flag isolate_product_domain. Please be careful about enabling this flag, as it will introduce experimental changes and work in progress.

  • ProductTaxRate to Product
  • ProductTypeTaxRate to ProductType
  • ClaimItem to ProductVariant
  • DiscountConditionProduct to Product
  • DiscountConditionProductCollection to ProductCollection
  • DiscountConditionProductTag to ProductTag
  • DiscountConditionProductType to ProductType
  • DiscountRule to Product

Features

Bugs

  • fix(medusa): Type in AbstractFulfillmentService by @pepijn-vanvlaanderen in #5003
  • fix(link-modules): Fix link module initialization by @adrien2p in #4990
  • fix(admin-ui): disabling analytics when opted out by @jporsay in #4939
  • fix(medusa): default sales channel for store variant endpoints by @pKorsholm in #4556
  • fix(link-modules): fix link configuration for product shipping profile by @riqwan in #5014
  • fix(orchestration): Infinite loop by reference update by @adrien2p in #5023
  • fix(medusa): duplicated migration by @carlos-r-l-rodrigues in #5029
  • fix(orchestration,link-modules,pricing,types): fix shippingprofile error outside of core + change link alias name by @riqwan in #5025
  • fix(medusa): Support fields param in list-variants by @olivermrbl in #5053
  • fix(create-medusa-app): fix command for windows OS by @shahednasser in #5061
  • fix(admin,admin-ui): copy public folder as part of admin build by @kasperkristensen in #5057
  • fix(medusa-react): fix useAdminAddStoreCurrency hook by @shahednasser in #5074
  • fix(medusa): Money amount detached migration by @adrien2p in #5079
  • fix(admin-ui): Load translations from path by @olivermrbl in #5064
  • feat(admin-ui): pt-BR translations and en version text fixes by @dahorarodrigo in #5066

Chores

Documentation

New Contributors

Full Changelog: v1.15.1...v1.16.0

v1.15.1

08 Sep 12:32
Compare
Choose a tag to compare

Highlights

Updated create-medusa-app onboarding

We've updated the create-medusa-app command with a new option, allowing you to get started with a Next.js storefront right away.

Try the new step in the flow yourself:

npx create-medusa-app@latest

Or pass the argument --with-nextjs-starter when running the command:

npx create-medusa-app@latest --with-nextjs-starter

AbstractFulfillmentService

We've done some housekeeping around fulfillment plugins, introducing a new interface and an abstract class correctly typed with added documentation.

As a result, fulfillment plugin services will now need to extend the AbstractFulfillmentService from @medusajs/medusa. Rest assured, the changes are backward compatible, so you are in no rush to migrate your implementation or plugin.

The deprecated fulfillment service will be removed in a future release. We will announce these changes beforehand so you can take the proper precautions.

Improvements to S3 file plugin

The AWS SDK used in medusa-file-s3 has been upgraded to V3, as V2 will enter maintenance mode later this year.

Cache-control has been added to the plugin options, allowing you to optimize your storage more granularly.

Solves:

EventBus enqueuer reconnection

We've introduced a mechanism to ensure the EventBus will not stop processing events in case the database connection momentarily dies.

If the connection is lost, we will try to reestablish the connection every 3rd second until successful. Changes was added in #4855 and further improved in #4963.

Additionally, logs have been added to inform the user in case this should happen.

Solves:

Breaking changes

Product Module
In #4965, we introduced breaking changes in the list and listAndCount methods of the ProductService in package @medusajs/product.

Specifically, the category filter has changed from category_ids to category_id:

// before
ProductService.list({ category_ids: ["pcat_123", "pcat_345"] })
ProductService.listAndCount({ category_ids: ["pcat_123", "pcat_345"] })

// after
ProductService.list({ category_id: ["pcat_123", "pcat_345"] })
ProductService.listAndCount({ category_id: ["pcat_123", "pcat_345"] })

Features

  • feat(create-medusa-app): add install Next.js storefront option by @shahednasser in #4968
  • feat(pricing, utils, types): adds money amount to pricing module by @riqwan in #4909
  • feat(medusa): Add AbstractFulfillmentService by @olivermrbl in #4922
  • feat(admin-ui): batch job completed notification by @fPolic in #4886
  • feat(medusa-file-s3): Add cache-control option + update to sdk v3 by @pevey in #4884
  • feat(pricing, types, utils, medusa-sdk): Pricing Module Setup + Currency by @riqwan in #4860
  • feat(link-modules,modules-sdk, utils, types, products) - Remote Link and Link modules by @carlos-r-l-rodrigues in #4695
  • feat(medusa, admin-ui): Improve gift card application by @mortenengel in #4944
  • feat(medusa-fulfillment-webshipper): Create webshipper return order by @josipmatichr in #4846
  • feat(products,types,pricing): allow scoping products by collection_id + pricing by currency_code by @riqwan in #4965
  • feat(medusa): Event bus db failure handling by @adrien2p in #4963

Bugs

  • fix(medusa-file-*): Add types as devDeps by @olivermrbl in #4871
  • fix(medusa): category_id and q params for list products endpoint ld work by @riqwan in #4889
  • fix(admin-ui): currency input exception by @fPolic in #4888
  • fix(admin-ui): delete customer group by @fPolic in #4893
  • fix(ci): Increase memory allocation for plugin tests by @olivermrbl in #4898
  • fix(medusa): Make event enqueuer reconnect the database when it lost the connection by @hanam1ni in #4855
  • fix(medusa, admin-ui): Add deleted_at to Return Reason unique constraint by @StephixOne in #4834
  • fix(utils, product, pricing, link-modules): add missing dependencies for utils + fix migration path issue by @riqwan in #4915
  • fix(medusa): csv parser check match prop on column by @fPolic in #4913
  • fix(medusa-payment-stripe): api endpoint for getStripePayments by @zulianrizki in #4928
  • fix(medusa): Double tax issue on return refund amount by @josipmatichr in #4899
  • fix(admin): Export RouteProps and SettingProps by @kasperkristensen in #4950
  • fix(medusa-plugin-brightpearl): Inventory sync for OOS items in brightpearl by @josipmatichr in #4966

Chores

Documentation

New Contributors

Full Changelog: v1.15.0...v1.16.0

v1.15.0

25 Aug 14:54
8190476
Compare
Choose a tag to compare

Highlights

Import and Export support in @medusajs/file-local

The file plugin, @medusajs/file-local, used for local development, now supports uploads and downloads via streaming, making it possible to import products right after setting up a project, among other things.

New Search UI in Medusa Documentation

You can now filter the search results to view specific results such as plugins, API reference, UI, and other areas of the documentation.

Check it out here.

Breaking changes

Reading and writing streams with file plugins now default to a private bucket across all providers.

The file plugin streaming API to upload to public/private buckets has been updated to be consistent across all providers.

// before
// MinIO
fileService.getUploadStreamDescriptor({..., usePrivateBucket: false})
// S3 & Spaces
fileService.getUploadStreamDescriptor({..., acl: "public-read"})

// after
fileService.getUploadStreamDescriptor({..., isPrivate: true}) // private bucket (default)
fileService.getUploadStreamDescriptor({..., isPrivate: false}) // public bucket

The following method signatures in the Price List and Product import strategies have been updated:

// before
downloadImportOpsFile(batchJobId: string, op: OperationType)
deleteOpsFiles(batchJobId: string)

// after
downloadImportOpsFile(batchJob: BatchJob, op: OperationType)
deleteOpsFiles(batchJob: BatchJob)

The following types specific to file services have moved from @medusajs/medusa to @medusajs/types:

export type FileServiceUploadResult = {
  url: string
  key: string
}

export type FileServiceGetUploadStreamResult = {
  writeStream: stream.PassThrough
  promise: Promise<any>
  url: string
  fileKey: string
  [x: string]: unknown
}

export type GetUploadedFileType = {
  fileKey: string
  isPrivate?: boolean
  [x: string]: unknown
}

export type DeleteFileType = {
  fileKey: string
  [x: string]: unknown
}

export type UploadStreamDescriptorType = {
  name: string
  ext?: string
  isPrivate?: boolean
  [x: string]: unknown
}

Features

  • feat(api-reference): Add rewrite to UI docs by @kasperkristensen in #4791
  • feat(medusa-file-local): implement missing streaming methods by @fPolic in #4788
  • feat(medusa): PriceListImportStrategy descriptive errors by @fPolic in #4842

Bugs

  • fix(medusa-interfaces, medusa-file-*): flag for streaming to a private bucket by @fPolic in #4771
  • fix(utils,product): mikro orm connection loader by @carlos-r-l-rodrigues in #4825
  • fix(medusa-telemetry): added missing babel dependencies by @shahednasser in #4817
  • fix(admin-ui): Fix sign out in admin panel not redirecting correctly by @StephixOne in #4837
  • fix(admin-ui): Fix variant creation when no stock locations provided by @StephixOne in #4843
  • fix(admin-ui): Typo for should in the "Create Region" form by @ vfrunza in #4854

Docs

Full Changelog: v1.14.0...v1.15.0

v1.14.0

17 Aug 15:20
Compare
Choose a tag to compare

Highlights

Admin Extensions reaches general availability

We are excited to announce the general availability of Admin Extensibility, shipping alongside version 1.14.0 of Medusa Core and a brand-new component library.

To start using it, install the latest versions of the core and admin packages, and check out our guide to building your first Admin Widgets and UI Routes.

yarn add @medusajs/admin@latest @medusajs/medusa@latest

The following is a breaking change from the beta version released in June.

path should now have the format /<path> instead of <path>. A path with a trailing / will still throw an error.

Separately, it is worth highlighting that to use environment variables in Admin Extensions, they should be prefixed with MEDUSA_ADMIN_. Variables with this prefix are included in the admin build and otherwise omitted for security reasons. If you have used Next.js or Gatsby, the concept will be familiar to you.

UI Component Library

To build Admin Extensions with the same look and feel as Medusa Admin, we are excited to announce our new component Library, Medusa UI.

Medusa UI is a React implementation of the Medusa design system. Most components are based on Radix UI Primitives, and we use Tailwind CSS for styling, shipping our own preset with our customizations.

The library is a dependency of our Admin package, so you can start using it if you have the latest version of that installed. Alternatively, you can install it in a standalone project. However, this comes with the required configuration. See the documentation.

To help you get started with Medusa UI, we have published its own documentation. This should get you up and running and provide more information on the available components and how to use them. You will also find information on Medusa Icons we have made public and more details on theming.

Bulk Editor improvements

The following improvements have been shipped to the Bulk Editor

  • 2-dimensional selection
  • Keyboard navigation
    • Arrow
    • Shift + arrow
    • Command/ctrl + shift + arrow
    • Tab
    • Shit + tab
  • Copy/paste functionality

Extended create-medusa-app options

The following options have been added:

--no-browser: Disables opening the browser at the end of the project creation and only shows success message.

--skip-db: Skips creating the database, running migrations, and seeding, and subsequently skips opening the browser. Useful if you want to set the database URL at a later point in the configurations.

--db-url <url>: Skips database creation and sets the database URL to the provided URL. Throws an error if connection to the database fails. Will still run migrations and open the admin after project creation. Useful if you already have a database created, locally or remotely.

--no-migrations: Skips running migrations, creating admin user, and seeding. If used, it's expected that you pass the `--db-url` option with a URL of a database that has all necessary migrations. Otherwise, unexpected errors will occur. Helpful only if combined with `--db-url`.

--directory-path <path>: Allows specifying the parent directory path to create the directory of the new project in.

Important fix: Cart Shipping Methods

Shipping methods are now always deleted on cart line item updates. This was always the intention, but the functionality has been broken until now. This release patches the functionality.

Other breaking changes

The FlagRouter that manages feature flags has been removed from @medusajs/medusa and added to @medusajs/utils.

Features

  • feat(workflows):product handlers should be reusable in different context by @adrien2p in #4703
  • feat(medusa,workflows) Create cart workflow by @riqwan in #4685
  • feat(orchestration,workflows): pipe oncomplete and workflow preparation by @carlos-r-l-rodrigues in #4697
  • feat(types, product, utils, medusa): Include shared connection for modules by @adrien2p in #4626
  • feat(workflows): Data aggregation by @adrien2p in #4732
  • feat(admin-ui): bulk advanced selections + copy/paste by @fPolic in #4568
  • feat(create-medusa-app): add database options by @shahednasser in #4733
  • feat(medusa-plugin-restock-notifications): Multi-warehouse support by @josipmatichr in #4718
  • feat(admin, admin-ui, medusa-js, medusa-react, medusa): Support Admin Extensions (#4761)

Bugs

  • fix(medusa): Fixed existingItems query in addOrUpdateLineItems by @DidierGuyon in #4714
  • fix(medusa): Remove shipping on updates to cart.items by @olivermrbl in #4715
  • fix(medusa-js): return type of collection hook + export by @olivermrbl in #4747
  • fix(medusa): removal of shipping methods on addOrUpdateLineItems by @SimonsThijs in #4725
  • fix(medusa): ignore region_id update w/o value change by @srindom in #4751

Chores

  • chore: scope errors on workflow to invoke by @riqwan in #4709
  • chore: Remove FlagRouter from core by @olivermrbl in #4710
  • chore(integration-tests): Test the create product workflow compensation by @adrien2p in #4716
  • chore(product): remove decorator where it is not necessary and cleanup by @adrien2p in #4731
  • chore: Remove rimraf from prepare by @olivermrbl in #4741

New Contributors

Full Changelog: v1.13.1...v1.14.0

v1.13.1

07 Aug 12:54
Compare
Choose a tag to compare

Highlights

Write logs to file

Environment variable LOG_FILE has been introduced to enable winston to write logs to file.

Thanks, @pevey, for the contribution.

Features

  • feat(product): Move mikro orm utils to the utils package by @adrien2p in #4631
  • feat(medusa): Expose some commonly used utils by @zhangpengchen in #4630
  • feat(prduct, utils, types): Create soft delete pattern for link module by @adrien2p in #4649
  • feat(workflows): Improve typings by @adrien2p in #4689
  • feat(product, types, modules-sdk): added event bus events for products by @riqwan in #4654
  • feat(medusa, types, utils, workflow): Migrate medusa workflow to the workflow package by @adrien2p in #4682
  • feat(medusa): Allow logging to file by @pevey in #4696
  • feat(medusa, utils): Allow object feature flags by @olivermrbl in #4701

Bugs

Chores

New Contributors

Full Changelog: v1.13.0...v1.13.1