cms.c2sgmbh/BUG_REPORT_CUSTOM_VIEWS.md
Martin Porwoll 4129ec516b fix(admin): disable custom views due to path-to-regexp bug
Custom admin views cause TypeError: Missing parameter name at 5
when used with @payloadcms/plugin-multi-tenant. This appears to be
a bug in Payload 3.68.4's custom view handling.

Changes:
- Disable custom TenantDashboard view temporarily
- Keep TenantBreadcrumb in afterNavLinks (works correctly)
- Add bug report template for Payload team

See BUG_REPORT_CUSTOM_VIEWS.md for full details.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-20 14:09:49 +00:00

3.6 KiB
Raw Blame History

Bug Report: Custom Admin Views cause TypeError with path-to-regexp

Summary

Custom admin views registered via admin.components.views cause a TypeError: Missing parameter name at 5 error from path-to-regexp when used together with @payloadcms/plugin-multi-tenant.

Environment

  • Payload Version: 3.68.4
  • Next.js Version: 15.5.9
  • React Version: 19.2.3
  • Node.js Version: 22.x
  • Database: PostgreSQL 17.6
  • Plugin: @payloadcms/plugin-multi-tenant 3.68.4

Steps to Reproduce

  1. Create a Payload 3.x project with the multi-tenant plugin
  2. Add a custom view to the admin config:
// payload.config.ts
export default buildConfig({
  admin: {
    user: Users.slug,
    components: {
      views: {
        MyCustomView: {
          Component: '@/components/admin/MyCustomView#MyCustomView',
          path: '/my-custom-view',
        },
      },
    },
  },
  plugins: [
    multiTenantPlugin({
      tenantsSlug: 'tenants',
      collections: { /* ... */ },
    }),
    // other plugins...
  ],
})
  1. Create a simple client component:
// src/components/admin/MyCustomView.tsx
'use client'

import React from 'react'

export const MyCustomView: React.FC = () => {
  return (
    <div style={{ padding: '2rem' }}>
      <h1>Custom View</h1>
    </div>
  )
}

export default MyCustomView
  1. Build and run the project
  2. Navigate to /admin/my-custom-view

Expected Behavior

The custom view should render correctly.

Actual Behavior

A server-side error occurs with the following message in production:

Uncaught Error: An error occurred in the Server Components render.
The specific message is omitted in production builds to avoid leaking sensitive details.

When running in development or checking server logs, the actual error is:

 TypeError: Missing parameter name at 5
    at <unknown> (.next/server/chunks/XXXX.js:5:9989)
    at <unknown> (.next/server/chunks/XXXX.js:5:10666)
    at g (.next/server/chunks/XXXX.js:5:11896)
    at e (.next/server/chunks/824.js:96:517138)
    at <unknown> (.next/server/app/(payload)/admin/[[...segments]]/page.js:1:31665)
    at Array.find (<anonymous>)
    at <unknown> (.next/server/app/(payload)/admin/[[...segments]]/page.js:1:31644)
    at ax (.next/server/app/(payload)/admin/[[...segments]]/page.js:1:34637) {
  digest: '3964718924'
}

Additional Context

What works:

  • Admin panel without custom views
  • Components in afterNavLinks (e.g., TenantBreadcrumb)
  • Components in beforeNavLinks (e.g., DashboardNavLink)

What fails:

  • ANY custom view registered via admin.components.views, even the simplest component without any dependencies

Investigation findings:

  • The error originates from path-to-regexp (version 6.3.0)
  • The error occurs during route matching in handleEndpoints.js
  • The error message "Missing parameter name at 5" suggests an invalid route pattern like /: is being generated somewhere
  • This happens regardless of the view path used (tested with /dashboard, /tenant-dashboard, /test-dashboard)
  • The issue appears to be triggered by the combination of custom views and the multi-tenant plugin

Workaround

Disable custom views and use only afterNavLinks/beforeNavLinks components:

admin: {
  components: {
    afterNavLinks: ['@/components/admin/TenantBreadcrumb#TenantBreadcrumb'],
    // views disabled due to bug
  },
},
  • @payloadcms/plugin-multi-tenant (may be related to the conflict)
  • @payloadcms/plugin-redirects
  • @payloadcms/plugin-seo
  • @payloadcms/plugin-form-builder
  • @payloadcms/plugin-nested-docs