Highlights
This is the final release of the v3.5.x line, before the imminent release of Vendure v3.6!
This release includes a whole host of improvements to the core and dashboard packages.
Note: this is also the final release for the following packages before they are moved to their new homes:
- @vendure/elasticsearch-plugin
- @vendure/payments-plugin
- @vendure/sentry-plugin
- @vendure/stellate-plugin
- @vendure/job-queue-plugin/package/pub-sub
Instructions on updating these packages will be included with the v3.6 release notes & migration guide.
Core fixes
- Atomic order merging —
OrderService.mergeOrdersis now concurrency-safe, preventing race conditions when multiple requests hit simultaneously - Stale shipping lines cleaned up — orders no longer carry phantom shipping lines from deleted shipping methods
- Schema-qualified EXISTS subqueries — fixes correctness issues in multi-schema PostgreSQL setups
- Channel cache invalidation — channel token is now set before query invalidation, fixing stale data issues after channel updates
- Wider
TranslationInputtype —languageCodenow accepts string literal unions, improving TypeScript ergonomics for custom language handling
Dashboard improvements
- Product options on variant detail — product options are now visible directly on the variant detail page
- Collection tree state persisted in URL — expanded/collapsed state survives navigation and page refreshes
- Custom fields hideable from UI — new
dashboardoption lets you hide custom fields from the Dashboard without removing them from the API - Nested address custom fields — custom fields on customer addresses now render correctly in the customer detail view
- Breadcrumbs update reactively — breadcrumbs now reflect entity name changes after a save without requiring a page reload
- Sidebar hover cards for collapsed nav — navigation sections now show a hover card when the sidebar is collapsed
- Faceted filter wrapping — filters no longer overflow horizontally on narrow screens
ConfigurableOperationInputvalidation fix — args with adefaultValueare now treated as valid even when empty- MoneyInput focus & onChange handling — fixes edge cases in the money input component
- Currency display in order table — correct currency now passed to the
Moneycomponent in order line items - OOM fix in plugin compilation — replaces
ts.createProgram()with per-filets.transpileModule()in the config loader, eliminating heap exhaustion whenvendure-config.tsimports plugins with heavy transitive dependencies (e.g.openai,ai,@ai-sdk/*). Compile time drops by up to 98% and memory use by up to 78%. PathAdaptergets newsourceRootoption ⚠️ BREAKING CHANGE IN EDGE CASES — where monorepos using a custompathAdapter.getCompiledConfigPathcannot build the dashboard because the output directory structure is flattened: If you use a custompathAdapter, setsourceRootto your workspace root to restore correct nesting:
vendureDashboardPlugin({
pathAdapter: {
sourceRoot: path.resolve(__dirname, '../..'), // workspace root
getCompiledConfigPath: ({ outputPath, configFileName }) => {
return join(outputPath, 'apps', 'vendure-server', 'src', configFileName);
},
},
})Non-monorepo setups are unaffected — the default behaviour is unchanged.
New translations
- 🇳🇱 Dutch (
nl) — thanks @LazyClicks! - 🇭🇺 Hungarian (
hu) — thanks @atistrcsn!
What's Changed
- Feat(dashboard) : nl translations by @LazyClicks in #4188
- fix(dashboard): Treat args with defaultValue as valid in ConfigurableOperationInput by @michaelbromley in #4462
- fix(dashboard): Display variant creation errors and list query errors by @grolmus in #4460
- fix(dashboard): Fix validation & UX issues in product variant option groups by @biggamesmallworld in #4458
- fix(ci): Pin third-party GitHub Actions to full commit SHAs by @michaelbromley in #4475
- chore(repo): Address SonarQube low-hanging fruit issues by @michaelbromley in #4477
- fix(core): Remove stale shipping lines when shipping method no longer exists by @colinpieper in #4487
- feat(dashboard): Add Hungarian translations by @atistrcsn in #4423
- fix(testing): Prevent e2e port collisions across packages by @michaelbromley in #4484
- fix(core): Make OrderService.mergeOrders atomic and concurrency-safe by @michaelbromley in #4488
- fix(dashboard): Use null instead of undefined when clearing relation custom fields by @grolmus in #4495
- fix(core): use schema-qualified table paths in EXISTS subqueries by @yasserlens in #4501
- fix: set channel token before query invalidation by @Ryrahul in #4472
- fix(dashboard): Show hover card for collapsed sidebar nav sections by @oliverstreissi in #4440
- fix: Channel cache invalidation after update by @Ryrahul in #4461
- fix(dashboard): Wrap faceted filters to prevent horizontal overflow by @grolmus in #4467
- fix(dashboard): Detect plugins compiled with tslib importHelpers by @michaelbromley in #4518
- fix(dashboard): Forward all ControllerProps in FormFieldWrapper by @gabriellbui in #4513
- fix(dashboard): Update breadcrumb reactively after entity mutation by @HouseinIsProgramming in #4512
- chore: Trim CLAUDE.md to implicit knowledge only by @BibiSebi in #4522
- fix(core): Widen TranslationInput languageCode to accept string literal unions by @HouseinIsProgramming in #4534
- fix(dashboard): Pass correct currency prop to Money component in order table by @isxwor in #4541
- feat(core): Add
dashboardoption to hide custom fields from Dashboard UI by @HouseinIsProgramming in #4544 - fix(docs): Correct typo in EventBus JSDoc by @latifniz in #4533
- fix(docs): Correct typo in ProductEvent JSDoc by @latifniz in #4539
- fix: Add nested address custom field in customer detail by @Ryrahul in #4546
- fix(ci): Update deploy dashboard workflow to match minor branch by @michaelbromley in #4556
- fix(dashboard): Replace ts.createProgram with per-file transpilation to prevent OOM by @michaelbromley in #4561
- fix(dashboard): Use tsconfig baseUrl as source root for monorepo pathAdapters by @michaelbromley in #4570
- docs: Add manifest.json and compile script by @dlhck in #4572
- feat(dashboard): Display product options on variant detail page by @grolmus in #4187
- fix(dashboard): Add missing i18n translations and CI sync check by @michaelbromley in #4578
- fix(dashboard): Persist collection tree expanded state in URL search params by @biggamesmallworld in #4509
- fix(dashboard): MoneyInput component to handle focus state and onChange by @harshit078 in #4586
New Contributors
- @LazyClicks made their first contribution in #4188
- @atistrcsn made their first contribution in #4423
- @latifniz made their first contribution in #4533
- @harshit078 made their first contribution in #4586
Full Changelog: v3.5.5...v3.5.6