Headless e-commerce framework. Lerna monorepo with fixed versioning.
- Make changes to a package
- Build it (or
bun run watchfor continuous) - Update
packages/dev-server/dev-config.tsif needed - Restart dev server
- Run e2e tests from the package dir
- When editing
@vendure/core, you usually need to watch@vendure/commontoo:bun run watch:core-common - The dev-server imports packages via TypeScript paths, so rebuilds are picked up on restart
- Switch DB with env var:
DB=postgresorDB=sqlitebeforebun run populate
- E2E cache: Seed data gets cached in
packages/<name>/e2e/__data__/. Delete to reset after schema changes.
When adding a new test, always check existing suites first before creating a new file:
catalog/product-list.spec.ts— product list behaviour (sorting, column settings, filtering)catalog/products.spec.ts— product detail pagecatalog/custom-fields.spec.ts— custom field rendering, editing, persistencesales/orders.spec.ts— draft orders, order detail, order modificationtests/regression/— only for tests that genuinely don't fit any existing suite
Add a comment referencing the issue number above the test, e.g.:
// #4393 — product list should default to sorting by updatedAt descending
test('should apply descending updatedAt sort by default', async ({ page }) => {Run dashboard e2e tests from packages/dashboard:
CI=true VITE_TEST_PORT=5176 bunx playwright test --config e2e/playwright.config.ts <test-path> --reporter=list- Include
Fixes #ISSUE_NUMBERin body, orRelates to #ISSUE_NUMBERif not a full fix master— bug fixes (default PR target)minor— new featuresmajor— breaking changes
- Dashboard stale build:
packages/dev-server/dist/accumulates stale Vite build artifacts across branch switches. Vite doesn't clean old hashed files, so old chunks can interfere (e.g. overwritingwindow.schemaInfo). Alwaysrm -rf packages/dev-server/distbefore rebuilding. Build withbunx vite build --base /dashboard/ --outDir ../dev-server/distfrompackages/dashboard/. Also check no stale Vite dev server is running on port 5173 —DashboardPluginauto-proxies to it instead of serving static files.