v2.1.2

mercurjs/mercurv2.1.2May 15, 2026by github-actions[bot]

AI Summary

This release resolves critical API bugs regarding product visibility, unlocks fulfillment constraints by dropping unique indexes, and introduces new features like variant inventory linking.

Key Highlights

  • Fixed `GET /store/products` 500 error
  • Unlocked fulfillment constraints for multiple sellers
  • Variant inventory linking feature
  • Migrated to oxlint for linting

New Features

  • Variant inventory linking
  • Image size limit configuration
  • Unlocked fulfillment constraints
  • Oxlint migration
  • Repo health improvements

Full Release Notes

## v2.1.2

Almost every change in this release came directly from community feedback on GitHub and Discord. Thank you to everyone who reported bugs, opened discussions, and pushed us to make Mercur better.

### πŸ› Bug fixes

- **`GET /store/products` returned 500: *"Trying to query by not existing property Product.seller"*** β€” `applySellerVisibilityFilter` set `seller.*` as a filterable field, which MikroORM couldn't resolve because Product β†’ seller lives in a link table, not a direct ORM relation. Replaced with the proper Medusa link-filter pattern via the `product_seller` join entity. Added a store-products integration spec covering visibility, status, id, limit and offset filters. *(Reported on Discord)*
- **Dashboard dev proxy 302 redirect loop in Vite** β€” `pathRewrite` was stripping the route prefix. Removed. (#915 β€” thanks @MoSuder)
- **`@mercurjs/dashboard-sdk` mangled Windows paths** in generated component import strings. Paths are now properly escaped in the virtual module. (#911 β€” thanks @stephanos221)
- **Block registry generated stale `@mercurjs/core-plugin` imports** after the 2.0 β†’ 2.1 rename. (#914 β€” thanks @aze4ka-salecapital)
- **`requests` registry block** referenced a non-existent `createSellerWorkflow.hooks.validateSellerInput`. Hook dropped. (#913 β€” thanks @aze4ka-salecapital)
- Vendor order summary thumbnail rendered at natural size (unsupported `"large"` value).
- Vendor + admin Polish translations: payment "captured" / "partiallyCaptured" no longer collide with fulfillment "Zrealizowane"; column headers clarified ("PΕ‚atnoΕ›Δ‡", "Dostawa"); commission label translated in vendor order summary.

### πŸš€ Unlocked fulfillment constraints

Thanks to @martinerko's detailed write-up in [discussion #831](https://github.com/mercurjs/mercur/discussions/831), v2.1.2 ships an auto-discovered migration script that drops three Medusa global partial unique indexes on `fulfillment_set.name`, `shipping_profile.name`, and `service_zone.name`. Multiple sellers can now create resources with the same name.

### ✨ New features

- **Variant inventory linking** β€” new action to link a variant inventory item or kit.
- **`imageLimit` config option** on `MercurConfig` (bytes, default 2 MB). Admin and vendor product media upload forms reject oversized files client-side.
- **`OnboardingCompanyExtraFields` removed** β€” unused extension point and its passthrough plumbing (`KNOWN_COMPANY_KEYS`, `companyExtras`, `additional_data`, `CompanyData` index signature) dropped.

### 🧹 Repo health

- **Migrated ESLint β†’ oxlint** (`^1.64.0`) across root and package scripts. New `.oxlintrc.json` with typescript, react, import and jsx-a11y plugins. Lint baseline: **0 errors, 1190 warnings across 4390 files**.
- **Dashboard SDK** dedupes `i18next` and `react` in Vite resolve.
- New `docs/ARCHITECTURE.md`, `docs/PRODUCT.md`, `packages/core/ARCHITECTURE.md`, rewritten `CLAUDE.md` quick reference β€” so contributors (and AI agents) can navigate the repo without reverse-engineering it.
- Frontend contribution guidelines landed (#917 β€” thanks @lhorus).
- Removed stale tooling (`tools/template-sync/`), meilisearch test stubs, and superseded docs.
- `turbo.json`: build outputs now `dist/**` + `.medusa/**`; `dev` depends on `^build`.

**Full Changelog**: https://github.com/mercurjs/mercur/compare/v2.1.1...v2.1.2