create-nextjs-cms 0.5.68 → 0.5.70

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/package.json +3 -3
  2. package/templates/default/app/(rootLayout)/(plugins)/[...slug]/.plugin-registry.mjs +7 -0
  3. package/templates/default/app/(rootLayout)/(plugins)/[...slug]/page.tsx +36 -41
  4. package/templates/default/app/(rootLayout)/(plugins)/[...slug]/plugin-server-registry.ts +21 -0
  5. package/templates/default/app/(rootLayout)/dashboard/page.tsx +44 -0
  6. package/templates/default/app/_trpc/client.ts +2 -3
  7. package/templates/default/app/api/editor/photo/route.ts +7 -0
  8. package/templates/default/app/api/trpc/[trpc]/route.ts +3 -3
  9. package/templates/default/app/api/video/route.ts +1 -1
  10. package/templates/default/components/AdminCard.tsx +15 -12
  11. package/templates/default/components/form/helpers/_section-hot-reload.js +1 -1
  12. package/templates/default/next.config.ts +14 -50
  13. package/templates/default/package.json +2 -2
  14. package/templates/default/app/(rootLayout)/(plugins)/[...slug]/PluginClient.tsx +0 -55
  15. package/templates/default/app/(rootLayout)/(plugins)/[...slug]/plugin-registry.ts +0 -16
  16. package/templates/default/app/(rootLayout)/page.tsx +0 -10
  17. package/templates/default/apps/cms/node_modules/next/node_modules/_tmp_40516_de1b9f7e36eccb968b79dbd2b8c388ea/LICENSE +0 -191
  18. package/templates/default/apps/cms/node_modules/next/node_modules/_tmp_40516_de1b9f7e36eccb968b79dbd2b8c388ea/README.md +0 -118
  19. package/templates/default/apps/cms/node_modules/next/node_modules/_tmp_40516_de1b9f7e36eccb968b79dbd2b8c388ea/install/build.js +0 -38
  20. package/templates/default/apps/cms/node_modules/next/node_modules/_tmp_40516_de1b9f7e36eccb968b79dbd2b8c388ea/install/check.js +0 -14
  21. package/templates/default/apps/cms/node_modules/next/node_modules/_tmp_40516_de1b9f7e36eccb968b79dbd2b8c388ea/lib/channel.js +0 -177
  22. package/templates/default/apps/cms/node_modules/next/node_modules/_tmp_40516_de1b9f7e36eccb968b79dbd2b8c388ea/lib/colour.js +0 -195
  23. package/templates/default/apps/cms/node_modules/next/node_modules/_tmp_40516_de1b9f7e36eccb968b79dbd2b8c388ea/lib/composite.js +0 -212
  24. package/templates/default/apps/cms/node_modules/next/node_modules/_tmp_40516_de1b9f7e36eccb968b79dbd2b8c388ea/lib/constructor.js +0 -499
  25. package/templates/default/apps/cms/node_modules/next/node_modules/_tmp_40516_de1b9f7e36eccb968b79dbd2b8c388ea/lib/index.d.ts +0 -1971
  26. package/templates/default/apps/cms/node_modules/next/node_modules/_tmp_40516_de1b9f7e36eccb968b79dbd2b8c388ea/lib/index.js +0 -16
  27. package/templates/default/apps/cms/node_modules/next/node_modules/_tmp_40516_de1b9f7e36eccb968b79dbd2b8c388ea/lib/input.js +0 -809
  28. package/templates/default/apps/cms/node_modules/next/node_modules/_tmp_40516_de1b9f7e36eccb968b79dbd2b8c388ea/lib/is.js +0 -143
  29. package/templates/default/apps/cms/node_modules/next/node_modules/_tmp_40516_de1b9f7e36eccb968b79dbd2b8c388ea/lib/libvips.js +0 -207
  30. package/templates/default/apps/cms/node_modules/next/node_modules/_tmp_40516_de1b9f7e36eccb968b79dbd2b8c388ea/lib/operation.js +0 -1016
  31. package/templates/default/apps/cms/node_modules/next/node_modules/_tmp_40516_de1b9f7e36eccb968b79dbd2b8c388ea/lib/output.js +0 -1666
  32. package/templates/default/apps/cms/node_modules/next/node_modules/_tmp_40516_de1b9f7e36eccb968b79dbd2b8c388ea/lib/resize.js +0 -595
  33. package/templates/default/apps/cms/node_modules/next/node_modules/_tmp_40516_de1b9f7e36eccb968b79dbd2b8c388ea/lib/sharp.js +0 -121
  34. package/templates/default/apps/cms/node_modules/next/node_modules/_tmp_40516_de1b9f7e36eccb968b79dbd2b8c388ea/lib/utility.js +0 -291
  35. package/templates/default/apps/cms/node_modules/next/node_modules/_tmp_40516_de1b9f7e36eccb968b79dbd2b8c388ea/package.json +0 -202
  36. package/templates/default/apps/cms/node_modules/next/node_modules/_tmp_40516_de1b9f7e36eccb968b79dbd2b8c388ea/src/binding.gyp +0 -298
  37. package/templates/default/apps/cms/node_modules/next/node_modules/_tmp_40516_de1b9f7e36eccb968b79dbd2b8c388ea/src/common.cc +0 -1130
  38. package/templates/default/apps/cms/node_modules/next/node_modules/_tmp_40516_de1b9f7e36eccb968b79dbd2b8c388ea/src/common.h +0 -402
  39. package/templates/default/apps/cms/node_modules/next/node_modules/_tmp_40516_de1b9f7e36eccb968b79dbd2b8c388ea/src/metadata.cc +0 -346
  40. package/templates/default/apps/cms/node_modules/next/node_modules/_tmp_40516_de1b9f7e36eccb968b79dbd2b8c388ea/src/metadata.h +0 -90
  41. package/templates/default/apps/cms/node_modules/next/node_modules/_tmp_40516_de1b9f7e36eccb968b79dbd2b8c388ea/src/operations.cc +0 -499
  42. package/templates/default/apps/cms/node_modules/next/node_modules/_tmp_40516_de1b9f7e36eccb968b79dbd2b8c388ea/src/operations.h +0 -137
  43. package/templates/default/apps/cms/node_modules/next/node_modules/_tmp_40516_de1b9f7e36eccb968b79dbd2b8c388ea/src/pipeline.cc +0 -1814
  44. package/templates/default/apps/cms/node_modules/next/node_modules/_tmp_40516_de1b9f7e36eccb968b79dbd2b8c388ea/src/pipeline.h +0 -408
  45. package/templates/default/apps/cms/node_modules/next/node_modules/_tmp_40516_de1b9f7e36eccb968b79dbd2b8c388ea/src/sharp.cc +0 -43
  46. package/templates/default/apps/cms/node_modules/next/node_modules/_tmp_40516_de1b9f7e36eccb968b79dbd2b8c388ea/src/stats.cc +0 -186
  47. package/templates/default/apps/cms/node_modules/next/node_modules/_tmp_40516_de1b9f7e36eccb968b79dbd2b8c388ea/src/stats.h +0 -62
  48. package/templates/default/apps/cms/node_modules/next/node_modules/_tmp_40516_de1b9f7e36eccb968b79dbd2b8c388ea/src/utilities.cc +0 -288
  49. package/templates/default/apps/cms/node_modules/next/node_modules/_tmp_40516_de1b9f7e36eccb968b79dbd2b8c388ea/src/utilities.h +0 -22
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-nextjs-cms",
3
- "version": "0.5.68",
3
+ "version": "0.5.70",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "bin": {
@@ -29,8 +29,8 @@
29
29
  "tsx": "^4.20.6",
30
30
  "typescript": "^5.9.2",
31
31
  "@lzcms/eslint-config": "0.3.0",
32
- "@lzcms/prettier-config": "0.1.0",
33
- "@lzcms/tsconfig": "0.1.0"
32
+ "@lzcms/tsconfig": "0.1.0",
33
+ "@lzcms/prettier-config": "0.1.0"
34
34
  },
35
35
  "prettier": "@lzcms/prettier-config",
36
36
  "scripts": {
@@ -0,0 +1,7 @@
1
+ // AUTO GENERATED FILE, DO NOT DELETE OR EDIT
2
+ // THIS FILE IS GENERATED BY THE PLUGIN SYSTEM
3
+ export const _pluginNamesMap = {
4
+ 'cpanel-dashboard': '@nextjs-cms-plugins/cpanel-dashboard/server',
5
+ 'cpanel-emails': '@nextjs-cms-plugins/cpanel-emails/server',
6
+ 'google-analytics': '@nextjs-cms-plugins/google-analytics/server',
7
+ }
@@ -1,41 +1,36 @@
1
- import { notFound, redirect } from 'next/navigation'
2
- import { api, HydrateClient } from 'nextjs-cms/api/trpc/server'
3
- import { findPluginRouteByPath } from 'nextjs-cms/plugins/server'
4
- import PluginClient from './PluginClient'
5
-
6
- export const dynamic = 'force-dynamic'
7
- type Params = Promise<{ slug?: string[] }>
8
-
9
- export default async function Page(props: { params: Params }) {
10
- const params = await props.params
11
- const slug = params.slug ?? []
12
-
13
- if (slug[0] === 'plugin') {
14
- const rest = slug.slice(1)
15
- if (rest.length === 0) {
16
- const routes = await api.plugins.routes()
17
- const target = routes[0]?.path
18
- if (target) {
19
- redirect(target)
20
- }
21
- notFound()
22
- }
23
- redirect(`/${rest.join('/')}`)
24
- }
25
-
26
- const path = `/${slug.join('/')}`
27
- const route = await findPluginRouteByPath(path)
28
- if (!route) {
29
- notFound()
30
- }
31
-
32
- if (route.prefetch) {
33
- await route.prefetch({ api })
34
- }
35
-
36
- return (
37
- <HydrateClient>
38
- <PluginClient packageName={route.pluginId} component={route.component} />
39
- </HydrateClient>
40
- )
41
- }
1
+ import { notFound } from 'next/navigation'
2
+ import auth from 'nextjs-cms/auth'
3
+ import { getAdminPrivileges } from 'nextjs-cms/api/helpers'
4
+ import { findPluginRouteByPath } from 'nextjs-cms/plugins/server'
5
+ import { getPluginServerComponent } from './plugin-server-registry'
6
+
7
+ export const dynamic = 'force-dynamic'
8
+ type Params = Promise<{ slug?: string[] }>
9
+
10
+ export default async function Page(props: { params: Params }) {
11
+ const params = await props.params
12
+ const slug = params.slug ?? []
13
+
14
+ const path = `/${slug.join('/')}`
15
+ const session = await auth()
16
+ if (!session?.user) {
17
+ notFound()
18
+ }
19
+
20
+ const plugin = await findPluginRouteByPath(path)
21
+ if (!plugin) {
22
+ notFound()
23
+ }
24
+
25
+ const privilegeSet = await getAdminPrivileges(session.user.id)
26
+ if (!privilegeSet.has(plugin.pluginName)) {
27
+ notFound()
28
+ }
29
+
30
+ const PluginComponent = await getPluginServerComponent(plugin.pluginRegistryName, plugin.component)
31
+ if (!PluginComponent) {
32
+ notFound()
33
+ }
34
+
35
+ return <PluginComponent />
36
+ }
@@ -0,0 +1,21 @@
1
+ import dynamic from 'next/dynamic'
2
+ import { _pluginNamesMap } from './.plugin-registry.mjs'
3
+
4
+ export const pluginNamesMap: Record<string, string> = {
5
+ ..._pluginNamesMap,
6
+ // A workaround to avoid importing error if no plugins are installed
7
+ blank: 'nextjs-cms/plugins/blank-component',
8
+ }
9
+
10
+ export const getPluginServerComponent = async (registryName: string, componentName: string | undefined) => {
11
+ const pluginName = pluginNamesMap[registryName]
12
+ const ClientComponent = dynamic(
13
+ () =>
14
+ import(pluginName ?? 'nextjs-cms/plugins/blank-component').then((mod) =>
15
+ componentName ? mod[componentName] : mod.default,
16
+ ),
17
+ { ssr: true },
18
+ )
19
+
20
+ return ClientComponent
21
+ }
@@ -0,0 +1,44 @@
1
+ export const dynamic = 'force-dynamic'
2
+
3
+ export default function DashboardPage() {
4
+ return (
5
+ <div className='w-full'>
6
+ <div className='bg-linear-to-r from-amber-200 via-orange-200 to-rose-200 p-8 text-foreground dark:from-amber-900 dark:via-orange-900 dark:to-rose-900'>
7
+ <h1 className='text-3xl font-extrabold tracking-tight'>Welcome to Mission Control</h1>
8
+ <p className='mt-2 text-base text-muted-foreground'>
9
+ Your CMS is ready. Chart a course, publish boldly, and keep the lights green.
10
+ </p>
11
+ </div>
12
+
13
+ <div className='space-y-6 p-6'>
14
+ <section className='rounded-lg border bg-card p-6 text-card-foreground shadow-sm'>
15
+ <h2 className='text-xl font-semibold'>Today&apos;s focus</h2>
16
+ <p className='mt-2 text-sm text-muted-foreground'>
17
+ Start with one small win: verify a section, ship a quick update, or polish a headline.
18
+ </p>
19
+ </section>
20
+
21
+ <section className='grid gap-4 md:grid-cols-3'>
22
+ <div className='rounded-lg border bg-card p-4 text-card-foreground shadow-sm'>
23
+ <div className='text-sm font-semibold'>Ship with confidence</div>
24
+ <div className='mt-2 text-sm text-muted-foreground'>
25
+ Keep changes tight and reversible. Small releases, fast feedback.
26
+ </div>
27
+ </div>
28
+ <div className='rounded-lg border bg-card p-4 text-card-foreground shadow-sm'>
29
+ <div className='text-sm font-semibold'>Stay organized</div>
30
+ <div className='mt-2 text-sm text-muted-foreground'>
31
+ Group your content by intent, not just by type.
32
+ </div>
33
+ </div>
34
+ <div className='rounded-lg border bg-card p-4 text-card-foreground shadow-sm'>
35
+ <div className='text-sm font-semibold'>Delight users</div>
36
+ <div className='mt-2 text-sm text-muted-foreground'>
37
+ A clean headline and a single strong image can do the heavy lifting.
38
+ </div>
39
+ </div>
40
+ </section>
41
+ </div>
42
+ </div>
43
+ )
44
+ }
@@ -1,4 +1,3 @@
1
- import type { AppRouter } from 'nextjs-cms/api'
2
- import { createTRPCReact } from '@trpc/react-query'
1
+ 'use client'
3
2
 
4
- export const trpc = createTRPCReact<AppRouter>()
3
+ export { trpc } from 'nextjs-cms/api/trpc/client'
@@ -2,6 +2,13 @@ import { NextRequest, NextResponse } from 'next/server'
2
2
  import sharp from 'sharp'
3
3
  import auth from 'nextjs-cms/auth'
4
4
 
5
+ /**
6
+ * This route handler is used to use a photo in rich text editor
7
+ * It expects an image file in the request body
8
+ * It returns the base64 string of the image
9
+ * @param request
10
+ * @returns NextResponse with the base64 string of the image
11
+ */
5
12
  export async function POST(request: NextRequest) {
6
13
  const session = await auth()
7
14
 
@@ -1,5 +1,5 @@
1
1
  import { fetchRequestHandler } from '@trpc/server/adapters/fetch'
2
- import { createTRPCContext, getAppRouter } from 'nextjs-cms/api'
2
+ import { createTRPCContext, getAppRouter } from 'nextjs-cms/api'
3
3
  import { NextRequest } from 'next/server'
4
4
 
5
5
  /**
@@ -13,11 +13,11 @@ const context = async (req: NextRequest) => {
13
13
  })
14
14
  }
15
15
 
16
- const handler = async (req: NextRequest) =>
16
+ const handler = async (req: NextRequest) =>
17
17
  fetchRequestHandler({
18
18
  endpoint: '/api/trpc',
19
19
  req,
20
- router: await getAppRouter(),
20
+ router: await getAppRouter(),
21
21
  createContext: () => context(req),
22
22
  /*onError(opts) {
23
23
  return opts.error
@@ -65,7 +65,7 @@ export async function GET(request: NextRequest) {
65
65
  if (!section || !section.name) {
66
66
  return NextResponse.json(
67
67
  {
68
- error: 'Invalid file path',
68
+ error: 'File not found, or you do not have access to it.',
69
69
  },
70
70
  { status: 400 },
71
71
  )
@@ -4,6 +4,7 @@ import useModal from '@/hooks/useModal'
4
4
  import ProtectedImage from '@/components/ProtectedImage'
5
5
  import AdminEditPage from '@/components/AdminEditPage'
6
6
  import { useToast } from '@/components/ui/use-toast'
7
+ import { ScrollArea } from '@/components/ui/scroll-area'
7
8
  import { Card, CardContent, CardFooter, CardHeader, CardTitle } from '@/components/ui/card'
8
9
  import { Badge } from '@/components/ui/badge'
9
10
  import { Button } from '@/components/ui/button'
@@ -76,28 +77,30 @@ export default function AdminCard({
76
77
  height={50}
77
78
  width={50}
78
79
  alt={admin.username}
79
- className='rounded-full ring-2 ring-inset ring-amber-300'
80
+ className='rounded-full ring-2 ring-amber-300 ring-inset'
80
81
  />
81
82
  )}
82
83
  </div>
83
84
  <div className='flex flex-col break-all'>
84
- <div className='text-sm font-medium text-foreground'>
85
+ <div className='text-foreground text-sm font-medium'>
85
86
  <div className='font-bold'>{admin.username}</div>
86
87
  </div>
87
88
  </div>
88
89
  </div>
89
90
  </CardTitle>
90
91
  </CardHeader>
91
- <CardContent>
92
- <div className='flex flex-wrap gap-2'>
93
- {admin.roles &&
94
- admin.roles.length > 0 &&
95
- admin.roles.map((role, index: number) => (
96
- <Badge key={index} className='border-foreground' variant='secondary'>
97
- {role.sectionName} ({role.operations})
98
- </Badge>
99
- ))}
100
- </div>
92
+ <CardContent className='p-1'>
93
+ <ScrollArea className='bg-accent/50 h-[100px] p-2' type='always'>
94
+ <div className='flex flex-wrap gap-2'>
95
+ {admin.roles &&
96
+ admin.roles.length > 0 &&
97
+ admin.roles.map((role, index: number) => (
98
+ <Badge key={index} className='border-foreground/30' variant='outline'>
99
+ {role.sectionName} ({role.operations})
100
+ </Badge>
101
+ ))}
102
+ </div>
103
+ </ScrollArea>
101
104
  </CardContent>
102
105
  <CardFooter className='flex flex-wrap gap-4'>
103
106
  <Button
@@ -8,4 +8,4 @@ export const revalidate = 0
8
8
 
9
9
  // @refresh reset
10
10
 
11
- export const configLastUpdated = 1767359297387
11
+ export const configLastUpdated = 1767626197465
@@ -1,36 +1,7 @@
1
1
  import type { NextConfig } from 'next'
2
2
 
3
3
  const nextConfig: NextConfig = {
4
- serverExternalPackages: [
5
- 'esbuild',
6
- 'esbuild-register',
7
- '@esbuild/win32-x64',
8
- // optional: if you deploy to linux/mac too, include these:
9
- '@esbuild/linux-x64',
10
- '@esbuild/linux-arm64',
11
- '@esbuild/darwin-x64',
12
- '@esbuild/darwin-arm64',
13
- ],
14
- turbopack: {
15
- rules: {
16
- 'esbuild.exe': {
17
- loaders: ['raw-loader'],
18
- as: 'executable',
19
- },
20
- '*.md': {
21
- loaders: ['raw-loader'],
22
- as: '*.js',
23
- },
24
- },
25
- },
26
4
 
27
- typescript: {
28
- // !! WARN !!
29
- // Dangerously allow production builds to successfully complete even if
30
- // your project has type errors.
31
- // !! WARN !!
32
- ignoreBuildErrors: true,
33
- },
34
5
  reactStrictMode: true,
35
6
  async rewrites() {
36
7
  return [
@@ -38,31 +9,24 @@ const nextConfig: NextConfig = {
38
9
  source: '/browse/:section',
39
10
  destination: '/browse/:section/1',
40
11
  },
12
+ {
13
+ source: '/',
14
+ destination: '/dashboard',
15
+ },
41
16
  ]
42
17
  },
43
18
  images: {
44
19
  formats: ['image/avif', 'image/webp'],
45
- unoptimized: true,
46
- remotePatterns: [
47
- {
48
- protocol: 'https',
49
- hostname: 'lazemnicms.com',
50
- port: '',
51
- pathname: '/**',
52
- },
53
- {
54
- protocol: 'https',
55
- hostname: 'api.lazemnicms.com',
56
- port: '',
57
- pathname: '/**',
58
- },
59
- {
60
- protocol: 'https',
61
- hostname: 'images.lazemnicms.com',
62
- port: '',
63
- pathname: '/**',
64
- },
65
- ],
20
+ remotePatterns: [
21
+ // Use remotePatterns in your next.config.js file to allow images from specific external paths and block all others.
22
+ // https://nextjs.org/docs/app/api-reference/components/image#remotepatterns
23
+ // {
24
+ // protocol: 'https',
25
+ // hostname: 'example.com',
26
+ // port: '',
27
+ // pathname: '/**',
28
+ // },
29
+ ],
66
30
  },
67
31
  }
68
32
 
@@ -64,7 +64,7 @@
64
64
  "nanoid": "^5.1.2",
65
65
  "next": "16.1.1",
66
66
  "next-themes": "^0.4.6",
67
- "nextjs-cms": "0.5.68",
67
+ "nextjs-cms": "0.5.70",
68
68
  "plaiceholder": "^3.0.0",
69
69
  "prettier-plugin-tailwindcss": "^0.7.2",
70
70
  "qrcode": "^1.5.4",
@@ -97,7 +97,7 @@
97
97
  "eslint-config-prettier": "^10.0.1",
98
98
  "eslint-plugin-prettier": "^5.2.3",
99
99
  "fs-extra": "^11.3.3",
100
- "nextjs-cms-kit": "0.5.68",
100
+ "nextjs-cms-kit": "0.5.70",
101
101
  "postcss": "^8.5.1",
102
102
  "prettier": "3.5.0",
103
103
  "raw-loader": "^4.0.2",
@@ -1,55 +0,0 @@
1
- 'use client'
2
-
3
- import dynamic from 'next/dynamic'
4
- import React, { useMemo } from 'react'
5
- import { trpc } from '@/app/_trpc/client'
6
- import { getPluginClientLoader } from './plugin-registry'
7
-
8
- type PluginClientProps = {
9
- packageName: string
10
- component: string
11
- }
12
-
13
- const isComponentType = (value: unknown): value is React.ComponentType<any> => {
14
- if (typeof value === 'function') return true
15
- if (typeof value === 'object' && value !== null && '$$typeof' in value) return true
16
- return false
17
- }
18
-
19
- export function PluginClient({ packageName, component }: PluginClientProps) {
20
- const loader = getPluginClientLoader(packageName)
21
- if (!loader) {
22
- return <div className='text-destructive p-6 text-sm'>Plugin client package not registered: {packageName}</div>
23
- }
24
-
25
- const Component = useMemo(
26
- () =>
27
- dynamic(
28
- async () => {
29
- const mod = await loader()
30
- const resolved =
31
- (mod.components && mod.components[component]) ||
32
- (mod as Record<string, React.ComponentType<any>>)[component] ||
33
- mod.default
34
-
35
- if (!resolved || !isComponentType(resolved)) {
36
- return {
37
- default: () => (
38
- <div className='text-destructive p-6 text-sm'>
39
- Plugin component not found: {component}
40
- </div>
41
- ),
42
- }
43
- }
44
-
45
- return { default: resolved }
46
- },
47
- { ssr: false },
48
- ),
49
- [component, loader],
50
- )
51
-
52
- return <Component trpc={trpc} />
53
- }
54
-
55
- export default PluginClient
@@ -1,16 +0,0 @@
1
- import type { ComponentType } from 'react'
2
-
3
- export type PluginClientComponent = ComponentType<any>
4
-
5
- export type PluginClientModule = {
6
- components?: Record<string, PluginClientComponent>
7
- default?: unknown
8
- [key: string]: unknown
9
- }
10
-
11
- export type PluginClientLoader = () => Promise<PluginClientModule>
12
-
13
- // Keep this list in sync with cms.config.ts and apps/cms/package.json.
14
- const pluginClientLoaders: Record<string, PluginClientLoader> = {}
15
-
16
- export const getPluginClientLoader = (packageName: string) => pluginClientLoaders[packageName]
@@ -1,10 +0,0 @@
1
- import { redirect } from 'next/navigation'
2
- import { getPluginRoutes } from 'nextjs-cms/plugins/server'
3
-
4
- export const dynamic = 'force-dynamic'
5
-
6
- export default async function Home() {
7
- const routes = await getPluginRoutes()
8
- const target = routes[0]?.path ?? '/admins'
9
- redirect(target)
10
- }