The default jest log reporter is garbage. Webstorm replaces it with
their own (which is pretty good), but vscode unfortunately uses the
default one.
This PR does the following to the jest reporter
**1. Replace the default reporter with the jest-ci-spec-reporter
reporter.**
The default reporter is hiding console logs and incorrectly rewriting
console history. Now, logs like these:
```
[20:56:16] INFO: ---- DROPPING DATABASE ----
[20:56:17] INFO: ---- DROPPED DATABASE ----
```
will be visible again. The default reporter was showing them for half a
second, then rewrites log history and hides them.
**2. add custom logger to showcase hidden error messages**
Some error messages are hidden and are only displayed at the end of the
test, in a very ugly way. If the test hangs, you might have to wait a
long time to see those errors. This PR makes sure that errors are logged
when they were intended to be logged.
They will not be printed in a pretty way (Webstorm for example prints
them in red and clickable, like a proper error message) - but at least
they will be printed instead of leaving you in the dark
**Override console global in jest setup to hide console log spam**
This turns logs like
```
console.log
initPayloadInt done
at log (helpers/initPayloadInt.ts:27:11)
```
into
`initPayloadInt done`
## CI
Yes, CI logs are actually usable now. We no longer have random console
logs floating around! It was horrible!
Finally, you can actually see which console logs belong to which test.
Before:
https://github.com/payloadcms/payload/actions/runs/11241674859/job/31253918825
After:
https://github.com/payloadcms/payload/actions/runs/11242035327/job/31255031760?pr=8607
**BEFORE**

What test triggered this "ValidationError: The following field is
invalid: filteredRelation" error? Who knows!! Could have been any test.
We will never know...
**AFTER:**
Finally, clarity

## Screenshots - Passing database test suite
## Passing database test suite
### Before


### After

## Screenshots - Failing test
### Before - that's where it hangs

### After - that's where it hangs
Actually shows me the error without having to wait 3 minutes for test to
timeout:

### Before - after waiting for 3 minutes for test to timeout:

(1000 lines of same error spam...)

### After - after waiting for 3 minutes for test to timeout:


(Error spam)

multi-tenant example (#8490)
Explore the Docs · Community Help · Try Live Demo · Roadmap · View G2 Reviews
Important
🎉 Payload 2.0 is now available! Read more in the announcement post.
Benefits over a regular CMS
- Don’t hit some third-party SaaS API, hit your own API
- Use your own database and own your data
- It's just Express - do what you want outside of Payload
- No need to learn how Payload works - if you know JS, you know Payload
- No vendor lock-in
- Avoid microservices hell - get everything (even auth) in one place
- Never touch ancient WP code again
- Build faster, never hit a roadblock
- Both admin and backend are 100% extensible
☁️ Deploy instantly with Payload Cloud.
Create a cloud account, connect your GitHub, and deploy in minutes.
🚀 Get started by self-hosting completely free, forever.
Before beginning to work with Payload, make sure you have all of the required software.
npx create-payload-app@latest
Alternatively, it only takes about five minutes to create an app from scratch.
🖱️ One-click templates
Jumpstart your next project by starting with a pre-made template. These are production-ready, end-to-end solutions designed to get you to market as fast as possible.
🛒 E-Commerce
Eliminate the need to combine Shopify and a CMS, and instead do it all with Payload + Stripe. Comes with a beautiful, fully functional front-end complete with shopping cart, checkout, orders, and much more.
🌐 Website
Build any kind of website, blog, or portfolio from small to enterprise. Comes with a beautiful, fully functional front-end complete with posts, projects, comments, and much more.
We're constantly adding more templates to our Templates Directory. If you maintain your own template, consider adding the payload-template topic to your GitHub repository for others to find.
✨ Features
- Completely free and open-source
- GraphQL, REST, and Local APIs
- Easily customizable ReactJS Admin
- Fully self-hosted
- Extensible Authentication
- Local file storage & upload
- Version History and Drafts
- Field-based Localization
- Block-based Layout Builder
- Extensible SlateJS rich text editor
- Array field type
- Field conditional logic
- Extremely granular Access Control
- Document and field-level hooks for every action Payload provides
- Built with Typescript & very Typescript-friendly
- Intensely fast API
- Highly secure thanks to HTTP-only cookies, CSRF protection, and more
🗒️ Documentation
Check out the Payload website to find in-depth documentation for everything that Payload offers.
Migrating from v1 to v2? Check out the 2.0 Release Notes on how to do it.
🙋 Contributing
If you want to add contributions to this repository, please follow the instructions in contributing.md.
📚 Examples
The Examples Directory is a great resource for learning how to setup Payload in a variety of different ways, but you can also find great examples in our blog and throughout our social media.
If you'd like to run the examples, you can either copy them to a folder outside this repo or run them directly by (1) navigating to the example's subfolder (cd examples/your-example-folder) and (2) using the --ignore-workspace flag to bypass workspace restrictions (e.g., pnpm --ignore-workspace install or pnpm --ignore-workspace dev).
You can see more examples at:
🔌 Plugins
Payload is highly extensible and allows you to install or distribute plugins that add or remove functionality. There are both officially-supported and community-supported plugins available. If you maintain your own plugin, consider adding the payload-plugin topic to your GitHub repository for others to find.
🚨 Need help?
There are lots of good conversations and resources in our Github Discussions board and our Discord Server. If you're struggling with something, chances are, someone's already solved what you're up against. 👇

