Skip to content

# Troubleshooting

Known issues, what causes them, and how to fix them.

## Requirements

Zenith requires Node.js 20.9 or newer, enforced by Next.js 16. Check your version with `node --version`.

## `createContext is not a function` on `npm run dev`

Affects v1.1.3 and earlier. The dev server fails while compiling a route, pointing at `src/app/not-found.tsx`:

    ⨯ TypeError: react__WEBPACK_IMPORTED_MODULE_0__.createContext is not a function
        at eval (webpack-internal:///(rsc)/./src/app/not-found.tsx)
    ⨯ TypeError: createContext only works in Client Components.
       Add the "use client" directive at the top of the file to use it.

Cause. `@dashboardpack/core` imported Radix's `Slot` from the `radix-ui` barrel, which evaluates every Radix primitive on import — and several of them call `React.createContext()` at module scope. Because `not-found.tsx` is a Server Component that imports `Button`, the barrel was pulled into the React Server Component graph, where `createContext` does not exist.

Whether it actually crashed depended on whether your bundler tree-shook the barrel, so the same source failed on some machines and worked on others.

Fix. Upgrade to `@dashboardpack/core` ^1.2.1, which imports `@radix-ui/react-slot` directly.

    npm install @dashboardpack/core@^1.2.1

## Scripts that fail on v1.1.3

v1.1.3 added several `overrides` to silence audit findings. Each forced a breaking major onto a package that could not handle it, and each broke a script. All are fixed in v1.1.4 — if you are patching an older copy, edit the `overrides` block in `package.json` and reinstall.

Script | Error | Remove this override
--- | --- | ---
`npm run test` | `MODULE_NOT_FOUND` for `undici/lib/handler/wrap-handler.js` | `undici`
`npm run lint` | `TypeError: expand is not a function` | `brace-expansion`
`npm run build-storybook` | `loadPartialConfig expects a callback` | `@babel/core`

`npm run lint` also crashed under ESLint 10, which removed the `context.getFilename()` API that `eslint-plugin-react` still calls. Zenith pins `eslint` to ^9 for this reason — do not upgrade it until `eslint-config-next` supports v10.

## Lint reports thousands of findings

If `npm run lint` reports findings with very large column numbers, it is linting generated output. Make sure `storybook-static/`, `coverage/` and `playwright-report/` are listed in `globalIgnores` in `eslint.config.mjs`. A clean run reports 8 findings.

## `ERESOLVE` on install

Usually a stale lockfile pinning a transitive peer — the Tiptap packages, for example, require an exact matching `@tiptap/pm`. A clean resolve fixes it:

    rm -rf node_modules package-lock.json
    npm install

If it persists, `npm install --legacy-peer-deps` is safe here.

## Keep installs reproducible

Install with the bundled `package-lock.json` in place. Deleting it re-resolves every caret range to whatever is newest that day, which is how several of the issues above first surfaced. Use `npm ci` in CI and for clean checkouts.

## Still stuck?

Check the Changelog for fixes in newer releases, or the Installation guide to verify your setup.