create-nextjs-cms 0.7.0 → 0.7.2
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.
- package/LICENSE +21 -21
- package/README.md +71 -71
- package/dist/helpers/utils.js +16 -16
- package/dist/lib/section-creators.js +166 -166
- package/package.json +3 -3
- package/templates/default/.eslintrc.json +5 -5
- package/templates/default/.prettierignore +7 -7
- package/templates/default/.prettierrc.json +27 -27
- package/templates/default/CHANGELOG.md +140 -140
- package/templates/default/_gitignore +57 -57
- package/templates/default/app/(auth)/auth/login/LoginPage.tsx +192 -192
- package/templates/default/app/(auth)/auth/login/page.tsx +11 -11
- package/templates/default/app/(auth)/auth-locale-provider.tsx +34 -34
- package/templates/default/app/(auth)/layout.tsx +81 -81
- package/templates/default/app/(rootLayout)/(plugins)/[...slug]/page.tsx +40 -40
- package/templates/default/app/(rootLayout)/(plugins)/[...slug]/plugin-server-registry.ts +22 -22
- package/templates/default/app/(rootLayout)/admins/page.tsx +10 -10
- package/templates/default/app/(rootLayout)/browse/[section]/[page]/page.tsx +22 -22
- package/templates/default/app/(rootLayout)/categorized/[section]/page.tsx +15 -15
- package/templates/default/app/(rootLayout)/dashboard/page.tsx +63 -63
- package/templates/default/app/(rootLayout)/dashboard-new/page.tsx +7 -7
- package/templates/default/app/(rootLayout)/edit/[section]/[itemId]/page.tsx +17 -17
- package/templates/default/app/(rootLayout)/layout.tsx +81 -81
- package/templates/default/app/(rootLayout)/loading.tsx +10 -10
- package/templates/default/app/(rootLayout)/log/page.tsx +7 -7
- package/templates/default/app/(rootLayout)/new/[section]/page.tsx +15 -15
- package/templates/default/app/(rootLayout)/section/[section]/page.tsx +16 -16
- package/templates/default/app/(rootLayout)/settings/page.tsx +13 -13
- package/templates/default/app/_trpc/client.ts +3 -3
- package/templates/default/app/api/auth/csrf/route.ts +25 -25
- package/templates/default/app/api/auth/refresh/route.ts +10 -10
- package/templates/default/app/api/auth/session/route.ts +20 -20
- package/templates/default/app/api/editor/photo/route.ts +49 -49
- package/templates/default/app/api/photo/route.ts +27 -27
- package/templates/default/app/api/submit/section/item/[slug]/route.ts +66 -66
- package/templates/default/app/api/submit/section/item/route.ts +56 -56
- package/templates/default/app/api/submit/section/simple/route.ts +57 -57
- package/templates/default/app/api/trpc/[trpc]/route.ts +33 -33
- package/templates/default/app/api/video/route.ts +174 -174
- package/templates/default/app/globals.css +219 -219
- package/templates/default/app/providers.tsx +152 -152
- package/templates/default/cms.config.ts +49 -52
- package/templates/default/components/AdminCard.tsx +166 -166
- package/templates/default/components/AdminEditPage.tsx +124 -124
- package/templates/default/components/AdminPrivilegeCard.tsx +185 -185
- package/templates/default/components/AdminsPage.tsx +43 -43
- package/templates/default/components/AnalyticsPage.tsx +128 -128
- package/templates/default/components/BarChartBox.tsx +42 -42
- package/templates/default/components/BrowsePage.tsx +106 -106
- package/templates/default/components/CategorizedSectionPage.tsx +31 -31
- package/templates/default/components/CategoryDeleteConfirmPage.tsx +130 -130
- package/templates/default/components/CategorySectionSelectInput.tsx +140 -140
- package/templates/default/components/ConditionalFields.tsx +49 -49
- package/templates/default/components/ContainerBox.tsx +24 -24
- package/templates/default/components/DashboardNewPage.tsx +253 -253
- package/templates/default/components/DashboardPage.tsx +188 -188
- package/templates/default/components/DashboardPageAlt.tsx +45 -45
- package/templates/default/components/DefaultNavItems.tsx +3 -3
- package/templates/default/components/Dropzone.tsx +154 -154
- package/templates/default/components/EmailCard.tsx +138 -138
- package/templates/default/components/EmailPasswordForm.tsx +85 -85
- package/templates/default/components/EmailQuotaForm.tsx +73 -73
- package/templates/default/components/EmailsPage.tsx +49 -49
- package/templates/default/components/ErrorComponent.tsx +16 -16
- package/templates/default/components/GalleryPhoto.tsx +93 -93
- package/templates/default/components/InfoCard.tsx +93 -93
- package/templates/default/components/ItemEditPage.tsx +214 -214
- package/templates/default/components/Layout.tsx +84 -84
- package/templates/default/components/LoadingSpinners.tsx +67 -67
- package/templates/default/components/LogPage.tsx +107 -107
- package/templates/default/components/Modal.tsx +166 -166
- package/templates/default/components/Navbar.tsx +258 -258
- package/templates/default/components/NewAdminForm.tsx +173 -173
- package/templates/default/components/NewEmailForm.tsx +132 -132
- package/templates/default/components/NewPage.tsx +205 -205
- package/templates/default/components/NewVariantComponent.tsx +229 -229
- package/templates/default/components/PhotoGallery.tsx +35 -35
- package/templates/default/components/PieChartBox.tsx +101 -101
- package/templates/default/components/ProgressBar.tsx +48 -48
- package/templates/default/components/ProtectedDocument.tsx +78 -78
- package/templates/default/components/ProtectedImage.tsx +143 -143
- package/templates/default/components/ProtectedVideo.tsx +76 -76
- package/templates/default/components/SectionItemCard.tsx +144 -144
- package/templates/default/components/SectionItemStatusBadge.tsx +17 -17
- package/templates/default/components/SectionPage.tsx +125 -125
- package/templates/default/components/SelectBox.tsx +98 -98
- package/templates/default/components/SelectInputButtons.tsx +125 -125
- package/templates/default/components/SettingsPage.tsx +232 -232
- package/templates/default/components/Sidebar.tsx +201 -201
- package/templates/default/components/SidebarDropdownItem.tsx +80 -80
- package/templates/default/components/SidebarItem.tsx +20 -20
- package/templates/default/components/ThemeProvider.tsx +8 -8
- package/templates/default/components/TooltipComponent.tsx +27 -27
- package/templates/default/components/VariantCard.tsx +124 -124
- package/templates/default/components/VariantEditPage.tsx +230 -230
- package/templates/default/components/analytics/BounceRate.tsx +70 -70
- package/templates/default/components/analytics/LivePageViews.tsx +55 -55
- package/templates/default/components/analytics/LiveUsersCount.tsx +33 -33
- package/templates/default/components/analytics/MonthlyPageViews.tsx +42 -42
- package/templates/default/components/analytics/TopCountries.tsx +52 -52
- package/templates/default/components/analytics/TopDevices.tsx +46 -46
- package/templates/default/components/analytics/TopMediums.tsx +58 -58
- package/templates/default/components/analytics/TopSources.tsx +45 -45
- package/templates/default/components/analytics/TotalPageViews.tsx +41 -41
- package/templates/default/components/analytics/TotalSessions.tsx +41 -41
- package/templates/default/components/analytics/TotalUniqueUsers.tsx +41 -41
- package/templates/default/components/custom/RightHomeRoomVariantCard.tsx +138 -138
- package/templates/default/components/dndKit/Draggable.tsx +21 -21
- package/templates/default/components/dndKit/Droppable.tsx +20 -20
- package/templates/default/components/dndKit/SortableItem.tsx +18 -18
- package/templates/default/components/form/DateRangeFormInput.tsx +57 -57
- package/templates/default/components/form/Form.tsx +317 -317
- package/templates/default/components/form/FormInputElement.tsx +70 -70
- package/templates/default/components/form/FormInputs.tsx +112 -112
- package/templates/default/components/form/helpers/_section-hot-reload.js +1 -1
- package/templates/default/components/form/helpers/util.ts +17 -17
- package/templates/default/components/form/inputs/CheckboxFormInput.tsx +33 -33
- package/templates/default/components/form/inputs/ColorFormInput.tsx +44 -44
- package/templates/default/components/form/inputs/DateFormInput.tsx +156 -156
- package/templates/default/components/form/inputs/DocumentFormInput.tsx +222 -222
- package/templates/default/components/form/inputs/MapFormInput.tsx +140 -140
- package/templates/default/components/form/inputs/MultipleSelectFormInput.tsx +83 -83
- package/templates/default/components/form/inputs/NumberFormInput.tsx +42 -42
- package/templates/default/components/form/inputs/PasswordFormInput.tsx +47 -47
- package/templates/default/components/form/inputs/PhotoFormInput.tsx +219 -219
- package/templates/default/components/form/inputs/RichTextFormInput.tsx +135 -135
- package/templates/default/components/form/inputs/SelectFormInput.tsx +175 -175
- package/templates/default/components/form/inputs/SlugFormInput.tsx +129 -129
- package/templates/default/components/form/inputs/TagsFormInput.tsx +154 -154
- package/templates/default/components/form/inputs/TextFormInput.tsx +48 -48
- package/templates/default/components/form/inputs/TextareaFormInput.tsx +47 -47
- package/templates/default/components/form/inputs/VideoFormInput.tsx +118 -118
- package/templates/default/components/locale-dropdown.tsx +74 -74
- package/templates/default/components/locale-picker.tsx +85 -85
- package/templates/default/components/login-locale-dropdown.tsx +46 -46
- package/templates/default/components/multi-select.tsx +1144 -1144
- package/templates/default/components/pagination/Pagination.tsx +36 -36
- package/templates/default/components/pagination/PaginationButtons.tsx +147 -147
- package/templates/default/components/theme-toggle.tsx +37 -37
- package/templates/default/components/ui/accordion.tsx +53 -53
- package/templates/default/components/ui/alert-dialog.tsx +157 -157
- package/templates/default/components/ui/alert.tsx +46 -46
- package/templates/default/components/ui/badge.tsx +38 -38
- package/templates/default/components/ui/button.tsx +62 -62
- package/templates/default/components/ui/calendar.tsx +166 -166
- package/templates/default/components/ui/card.tsx +43 -43
- package/templates/default/components/ui/checkbox.tsx +29 -29
- package/templates/default/components/ui/command.tsx +137 -137
- package/templates/default/components/ui/custom-alert-dialog.tsx +113 -113
- package/templates/default/components/ui/custom-dialog.tsx +123 -123
- package/templates/default/components/ui/dialog.tsx +123 -123
- package/templates/default/components/ui/dropdown-menu.tsx +182 -182
- package/templates/default/components/ui/input-group.tsx +54 -54
- package/templates/default/components/ui/input.tsx +22 -22
- package/templates/default/components/ui/label.tsx +19 -19
- package/templates/default/components/ui/popover.tsx +42 -42
- package/templates/default/components/ui/progress.tsx +31 -31
- package/templates/default/components/ui/scroll-area.tsx +42 -42
- package/templates/default/components/ui/select.tsx +165 -165
- package/templates/default/components/ui/separator.tsx +28 -28
- package/templates/default/components/ui/sheet.tsx +103 -103
- package/templates/default/components/ui/switch.tsx +29 -29
- package/templates/default/components/ui/table.tsx +83 -83
- package/templates/default/components/ui/tabs.tsx +55 -55
- package/templates/default/components/ui/toast.tsx +113 -113
- package/templates/default/components/ui/toaster.tsx +35 -35
- package/templates/default/components/ui/tooltip.tsx +30 -30
- package/templates/default/components/ui/use-toast.ts +188 -188
- package/templates/default/components.json +21 -21
- package/templates/default/context/ModalProvider.tsx +53 -53
- package/templates/default/drizzle.config.ts +4 -4
- package/templates/default/dynamic-schemas/schema.ts +10 -0
- package/templates/default/env/env.js +130 -130
- package/templates/default/envConfig.ts +4 -4
- package/templates/default/hooks/useModal.ts +8 -8
- package/templates/default/lib/apiHelpers.ts +92 -92
- package/templates/default/lib/postinstall.js +14 -14
- package/templates/default/lib/utils.ts +6 -6
- package/templates/default/next-env.d.ts +6 -6
- package/templates/default/next.config.ts +23 -23
- package/templates/default/package.json +2 -4
- package/templates/default/postcss.config.mjs +6 -6
- package/templates/default/proxy.ts +32 -32
- package/templates/default/tsconfig.json +48 -48
package/LICENSE
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
MIT License
|
|
2
|
-
|
|
3
|
-
Copyright (c) 2025 create-nextjs-cms
|
|
4
|
-
|
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
-
in the Software without restriction, including without limitation the rights
|
|
8
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
-
furnished to do so, subject to the following conditions:
|
|
11
|
-
|
|
12
|
-
The above copyright notice and this permission notice shall be included in all
|
|
13
|
-
copies or substantial portions of the Software.
|
|
14
|
-
|
|
15
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
-
SOFTWARE.
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 create-nextjs-cms
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,71 +1,71 @@
|
|
|
1
|
-
# Create Nextjs CMS
|
|
2
|
-
|
|
3
|
-
The best and official way to create a nextjs-cms project with all the necessary configuration and dependencies.
|
|
4
|
-
|
|
5
|
-
## Installation
|
|
6
|
-
|
|
7
|
-
You can create a new cms project interactively by running:
|
|
8
|
-
|
|
9
|
-
```bash
|
|
10
|
-
npx create-nextjs-cms
|
|
11
|
-
# or
|
|
12
|
-
yarn create nextjs-cms
|
|
13
|
-
# or
|
|
14
|
-
pnpm create nextjs-cms
|
|
15
|
-
# or
|
|
16
|
-
bun create nextjs-cms
|
|
17
|
-
```
|
|
18
|
-
|
|
19
|
-
## Project Structure
|
|
20
|
-
|
|
21
|
-
After running `create-nextjs-cms`, you'll have a fully configured nextjs-cms project with:
|
|
22
|
-
|
|
23
|
-
- ✅ Next.js application setup
|
|
24
|
-
- ✅ CMS configuration files
|
|
25
|
-
- ✅ Database configuration
|
|
26
|
-
- ✅ TypeScript configuration
|
|
27
|
-
- ✅ All necessary dependencies
|
|
28
|
-
- ✅ Example sections and fields
|
|
29
|
-
- ✅ Development scripts
|
|
30
|
-
|
|
31
|
-
## Next Steps
|
|
32
|
-
|
|
33
|
-
After creating your project:
|
|
34
|
-
|
|
35
|
-
```bash
|
|
36
|
-
cd my-cms-app
|
|
37
|
-
pnpm dev
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
Then visit `http://localhost:3000` to see your CMS in action!
|
|
41
|
-
|
|
42
|
-
## Requirements
|
|
43
|
-
|
|
44
|
-
- Node.js 18+
|
|
45
|
-
- A package manager (pnpm, npm, yarn, or bun)
|
|
46
|
-
|
|
47
|
-
## Troubleshooting
|
|
48
|
-
|
|
49
|
-
### Directory already exists
|
|
50
|
-
|
|
51
|
-
If you try to create a project in a directory that already exists, you'll get an error. Either:
|
|
52
|
-
- Choose a different directory name
|
|
53
|
-
- Use `.` to create in the current directory (must be empty)
|
|
54
|
-
|
|
55
|
-
### Installation fails
|
|
56
|
-
|
|
57
|
-
If automatic dependency installation fails, you can manually install:
|
|
58
|
-
|
|
59
|
-
```bash
|
|
60
|
-
cd my-cms-app
|
|
61
|
-
pnpm install
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
### Template not found
|
|
65
|
-
|
|
66
|
-
If you see an error about the template directory not being found, ensure you're using the published version of the package from npm, not a local development version.
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
## License
|
|
70
|
-
|
|
71
|
-
MIT License - see LICENSE file for details.
|
|
1
|
+
# Create Nextjs CMS
|
|
2
|
+
|
|
3
|
+
The best and official way to create a nextjs-cms project with all the necessary configuration and dependencies.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
You can create a new cms project interactively by running:
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npx create-nextjs-cms
|
|
11
|
+
# or
|
|
12
|
+
yarn create nextjs-cms
|
|
13
|
+
# or
|
|
14
|
+
pnpm create nextjs-cms
|
|
15
|
+
# or
|
|
16
|
+
bun create nextjs-cms
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Project Structure
|
|
20
|
+
|
|
21
|
+
After running `create-nextjs-cms`, you'll have a fully configured nextjs-cms project with:
|
|
22
|
+
|
|
23
|
+
- ✅ Next.js application setup
|
|
24
|
+
- ✅ CMS configuration files
|
|
25
|
+
- ✅ Database configuration
|
|
26
|
+
- ✅ TypeScript configuration
|
|
27
|
+
- ✅ All necessary dependencies
|
|
28
|
+
- ✅ Example sections and fields
|
|
29
|
+
- ✅ Development scripts
|
|
30
|
+
|
|
31
|
+
## Next Steps
|
|
32
|
+
|
|
33
|
+
After creating your project:
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
cd my-cms-app
|
|
37
|
+
pnpm dev
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
Then visit `http://localhost:3000` to see your CMS in action!
|
|
41
|
+
|
|
42
|
+
## Requirements
|
|
43
|
+
|
|
44
|
+
- Node.js 18+
|
|
45
|
+
- A package manager (pnpm, npm, yarn, or bun)
|
|
46
|
+
|
|
47
|
+
## Troubleshooting
|
|
48
|
+
|
|
49
|
+
### Directory already exists
|
|
50
|
+
|
|
51
|
+
If you try to create a project in a directory that already exists, you'll get an error. Either:
|
|
52
|
+
- Choose a different directory name
|
|
53
|
+
- Use `.` to create in the current directory (must be empty)
|
|
54
|
+
|
|
55
|
+
### Installation fails
|
|
56
|
+
|
|
57
|
+
If automatic dependency installation fails, you can manually install:
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
cd my-cms-app
|
|
61
|
+
pnpm install
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### Template not found
|
|
65
|
+
|
|
66
|
+
If you see an error about the template directory not being found, ensure you're using the published version of the package from npm, not a local development version.
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
## License
|
|
70
|
+
|
|
71
|
+
MIT License - see LICENSE file for details.
|
package/dist/helpers/utils.js
CHANGED
|
@@ -4,22 +4,22 @@ import os from 'node:os';
|
|
|
4
4
|
import { randomBytes } from 'node:crypto';
|
|
5
5
|
import { log } from '@clack/prompts';
|
|
6
6
|
import chalk from 'chalk';
|
|
7
|
-
export const TITLE_TEXT = `
|
|
8
|
-
_
|
|
9
|
-
___ _ __ ___ __ _| |_ ___
|
|
10
|
-
/ __| '__/ _ \\/ _\\\` | __/ _ \\
|
|
11
|
-
| (__| | | __/ (_| | || __/
|
|
12
|
-
\\___|_| \\___|\\__,_|\\__\\___|
|
|
13
|
-
_ _
|
|
14
|
-
_ __ _____ _| |_ (_)___
|
|
15
|
-
| '_ \\ / _ \\ \\/ / __|| / __|
|
|
16
|
-
| | | | __/> <| |_ | \\__ \\
|
|
17
|
-
|_| |_|\\___/_/\\_\\__|/ |___/
|
|
18
|
-
|__/
|
|
19
|
-
___ _ __ ___ ___
|
|
20
|
-
/ __| '_ \\\` _ \\/ __|
|
|
21
|
-
| (__| | | | | \\__ \\
|
|
22
|
-
\\___|_| |_| |_|___/
|
|
7
|
+
export const TITLE_TEXT = `
|
|
8
|
+
_
|
|
9
|
+
___ _ __ ___ __ _| |_ ___
|
|
10
|
+
/ __| '__/ _ \\/ _\\\` | __/ _ \\
|
|
11
|
+
| (__| | | __/ (_| | || __/
|
|
12
|
+
\\___|_| \\___|\\__,_|\\__\\___|
|
|
13
|
+
_ _
|
|
14
|
+
_ __ _____ _| |_ (_)___
|
|
15
|
+
| '_ \\ / _ \\ \\/ / __|| / __|
|
|
16
|
+
| | | | __/> <| |_ | \\__ \\
|
|
17
|
+
|_| |_|\\___/_/\\_\\__|/ |___/
|
|
18
|
+
|__/
|
|
19
|
+
___ _ __ ___ ___
|
|
20
|
+
/ __| '_ \\\` _ \\/ __|
|
|
21
|
+
| (__| | | | | \\__ \\
|
|
22
|
+
\\___|_| |_| |_|___/
|
|
23
23
|
`;
|
|
24
24
|
/** Expand ~ to home */
|
|
25
25
|
export function expandHome(p) {
|
|
@@ -8,67 +8,67 @@ export async function createBlogSection(targetDir) {
|
|
|
8
8
|
const blogSectionPath = path.join(sectionsDir, 'blog.section.ts');
|
|
9
9
|
// Ensure sections directory exists
|
|
10
10
|
await fs.ensureDir(sectionsDir);
|
|
11
|
-
const blogSectionContent = `import { photoField, richTextField, textField, tagsField } from 'nextjs-cms/core/fields'
|
|
12
|
-
import { hasItemsSection } from 'nextjs-cms/core/sections'
|
|
13
|
-
|
|
14
|
-
const title = textField({
|
|
15
|
-
name: 'title',
|
|
16
|
-
label: 'Title',
|
|
17
|
-
required: true,
|
|
18
|
-
order: 1,
|
|
19
|
-
})
|
|
20
|
-
|
|
21
|
-
const coverPhotoField = photoField({
|
|
22
|
-
name: 'coverphoto',
|
|
23
|
-
label: 'Cover Photo',
|
|
24
|
-
required: true,
|
|
25
|
-
order: 2,
|
|
26
|
-
fileType: ['jpg', 'jpeg', 'png', 'webp'],
|
|
27
|
-
})
|
|
28
|
-
|
|
29
|
-
const content = richTextField({
|
|
30
|
-
name: 'content',
|
|
31
|
-
label: 'Content',
|
|
32
|
-
required: true,
|
|
33
|
-
order: 3,
|
|
34
|
-
})
|
|
35
|
-
|
|
36
|
-
const keywords = tagsField({
|
|
37
|
-
name: 'keywords',
|
|
38
|
-
label: 'Keywords',
|
|
39
|
-
required: false,
|
|
40
|
-
order: 4,
|
|
41
|
-
})
|
|
42
|
-
|
|
43
|
-
export default hasItemsSection({
|
|
44
|
-
name: 'blog',
|
|
45
|
-
order: 1,
|
|
46
|
-
icon: 'icon',
|
|
47
|
-
readonly: false,
|
|
48
|
-
headingField: title,
|
|
49
|
-
title: {
|
|
50
|
-
section: 'Blog',
|
|
51
|
-
singular: 'Post',
|
|
52
|
-
plural: 'Posts',
|
|
53
|
-
},
|
|
54
|
-
gallery: {
|
|
55
|
-
db: {
|
|
56
|
-
tableName: 'blog_gallery',
|
|
57
|
-
identifierField: 'reference_id',
|
|
58
|
-
photoNameField: 'photo',
|
|
59
|
-
metaField: 'meta',
|
|
60
|
-
},
|
|
61
|
-
},
|
|
62
|
-
db: {
|
|
63
|
-
table: 'blog',
|
|
64
|
-
},
|
|
65
|
-
search: {
|
|
66
|
-
searchFields: [title],
|
|
67
|
-
},
|
|
68
|
-
coverPhotoField: coverPhotoField,
|
|
69
|
-
generateQR: false,
|
|
70
|
-
fields: [title, coverPhotoField, content, keywords],
|
|
71
|
-
})
|
|
11
|
+
const blogSectionContent = `import { photoField, richTextField, textField, tagsField } from 'nextjs-cms/core/fields'
|
|
12
|
+
import { hasItemsSection } from 'nextjs-cms/core/sections'
|
|
13
|
+
|
|
14
|
+
const title = textField({
|
|
15
|
+
name: 'title',
|
|
16
|
+
label: 'Title',
|
|
17
|
+
required: true,
|
|
18
|
+
order: 1,
|
|
19
|
+
})
|
|
20
|
+
|
|
21
|
+
const coverPhotoField = photoField({
|
|
22
|
+
name: 'coverphoto',
|
|
23
|
+
label: 'Cover Photo',
|
|
24
|
+
required: true,
|
|
25
|
+
order: 2,
|
|
26
|
+
fileType: ['jpg', 'jpeg', 'png', 'webp'],
|
|
27
|
+
})
|
|
28
|
+
|
|
29
|
+
const content = richTextField({
|
|
30
|
+
name: 'content',
|
|
31
|
+
label: 'Content',
|
|
32
|
+
required: true,
|
|
33
|
+
order: 3,
|
|
34
|
+
})
|
|
35
|
+
|
|
36
|
+
const keywords = tagsField({
|
|
37
|
+
name: 'keywords',
|
|
38
|
+
label: 'Keywords',
|
|
39
|
+
required: false,
|
|
40
|
+
order: 4,
|
|
41
|
+
})
|
|
42
|
+
|
|
43
|
+
export default hasItemsSection({
|
|
44
|
+
name: 'blog',
|
|
45
|
+
order: 1,
|
|
46
|
+
icon: 'icon',
|
|
47
|
+
readonly: false,
|
|
48
|
+
headingField: title,
|
|
49
|
+
title: {
|
|
50
|
+
section: 'Blog',
|
|
51
|
+
singular: 'Post',
|
|
52
|
+
plural: 'Posts',
|
|
53
|
+
},
|
|
54
|
+
gallery: {
|
|
55
|
+
db: {
|
|
56
|
+
tableName: 'blog_gallery',
|
|
57
|
+
identifierField: 'reference_id',
|
|
58
|
+
photoNameField: 'photo',
|
|
59
|
+
metaField: 'meta',
|
|
60
|
+
},
|
|
61
|
+
},
|
|
62
|
+
db: {
|
|
63
|
+
table: 'blog',
|
|
64
|
+
},
|
|
65
|
+
search: {
|
|
66
|
+
searchFields: [title],
|
|
67
|
+
},
|
|
68
|
+
coverPhotoField: coverPhotoField,
|
|
69
|
+
generateQR: false,
|
|
70
|
+
fields: [title, coverPhotoField, content, keywords],
|
|
71
|
+
})
|
|
72
72
|
`;
|
|
73
73
|
await fs.writeFile(blogSectionPath, blogSectionContent, 'utf-8');
|
|
74
74
|
}
|
|
@@ -80,62 +80,62 @@ export async function createCategorySection(targetDir) {
|
|
|
80
80
|
const categorySectionPath = path.join(sectionsDir, 'categories.section.ts');
|
|
81
81
|
// Ensure sections directory exists
|
|
82
82
|
await fs.ensureDir(sectionsDir);
|
|
83
|
-
const categorySectionContent = `import { numberField, photoField, textField } from 'nextjs-cms/core/fields'
|
|
84
|
-
import { categorySection } from 'nextjs-cms/core/sections'
|
|
85
|
-
|
|
86
|
-
const orderInput = numberField({
|
|
87
|
-
name: 'cat_order',
|
|
88
|
-
label: 'Order',
|
|
89
|
-
required: true,
|
|
90
|
-
order: 0,
|
|
91
|
-
})
|
|
92
|
-
|
|
93
|
-
const title = textField({
|
|
94
|
-
name: 'title',
|
|
95
|
-
label: 'Title',
|
|
96
|
-
required: true,
|
|
97
|
-
order: 1,
|
|
98
|
-
})
|
|
99
|
-
|
|
100
|
-
const slugInput = textField({
|
|
101
|
-
name: 'slug',
|
|
102
|
-
label: 'Slug',
|
|
103
|
-
required: true,
|
|
104
|
-
order: 2,
|
|
105
|
-
})
|
|
106
|
-
|
|
107
|
-
const image = photoField({
|
|
108
|
-
name: 'image',
|
|
109
|
-
label: 'Image',
|
|
110
|
-
required: false,
|
|
111
|
-
order: 3,
|
|
112
|
-
fileType: ['png', 'jpg', 'jpeg', 'webp'],
|
|
113
|
-
})
|
|
114
|
-
|
|
115
|
-
const description = textField({
|
|
116
|
-
name: 'description',
|
|
117
|
-
label: 'Description',
|
|
118
|
-
required: false,
|
|
119
|
-
order: 4,
|
|
120
|
-
})
|
|
121
|
-
|
|
122
|
-
export default categorySection({
|
|
123
|
-
title: {
|
|
124
|
-
section: 'Categories',
|
|
125
|
-
singular: 'Category',
|
|
126
|
-
plural: 'Categories',
|
|
127
|
-
},
|
|
128
|
-
name: 'categories',
|
|
129
|
-
icon: 'category',
|
|
130
|
-
headingField: title,
|
|
131
|
-
order: 2,
|
|
132
|
-
db: {
|
|
133
|
-
table: 'categories',
|
|
134
|
-
unique: [{ columns: [slugInput] }],
|
|
135
|
-
},
|
|
136
|
-
fields: [orderInput, title, slugInput, image, description],
|
|
137
|
-
depth: 3,
|
|
138
|
-
})
|
|
83
|
+
const categorySectionContent = `import { numberField, photoField, textField } from 'nextjs-cms/core/fields'
|
|
84
|
+
import { categorySection } from 'nextjs-cms/core/sections'
|
|
85
|
+
|
|
86
|
+
const orderInput = numberField({
|
|
87
|
+
name: 'cat_order',
|
|
88
|
+
label: 'Order',
|
|
89
|
+
required: true,
|
|
90
|
+
order: 0,
|
|
91
|
+
})
|
|
92
|
+
|
|
93
|
+
const title = textField({
|
|
94
|
+
name: 'title',
|
|
95
|
+
label: 'Title',
|
|
96
|
+
required: true,
|
|
97
|
+
order: 1,
|
|
98
|
+
})
|
|
99
|
+
|
|
100
|
+
const slugInput = textField({
|
|
101
|
+
name: 'slug',
|
|
102
|
+
label: 'Slug',
|
|
103
|
+
required: true,
|
|
104
|
+
order: 2,
|
|
105
|
+
})
|
|
106
|
+
|
|
107
|
+
const image = photoField({
|
|
108
|
+
name: 'image',
|
|
109
|
+
label: 'Image',
|
|
110
|
+
required: false,
|
|
111
|
+
order: 3,
|
|
112
|
+
fileType: ['png', 'jpg', 'jpeg', 'webp'],
|
|
113
|
+
})
|
|
114
|
+
|
|
115
|
+
const description = textField({
|
|
116
|
+
name: 'description',
|
|
117
|
+
label: 'Description',
|
|
118
|
+
required: false,
|
|
119
|
+
order: 4,
|
|
120
|
+
})
|
|
121
|
+
|
|
122
|
+
export default categorySection({
|
|
123
|
+
title: {
|
|
124
|
+
section: 'Categories',
|
|
125
|
+
singular: 'Category',
|
|
126
|
+
plural: 'Categories',
|
|
127
|
+
},
|
|
128
|
+
name: 'categories',
|
|
129
|
+
icon: 'category',
|
|
130
|
+
headingField: title,
|
|
131
|
+
order: 2,
|
|
132
|
+
db: {
|
|
133
|
+
table: 'categories',
|
|
134
|
+
unique: [{ columns: [slugInput] }],
|
|
135
|
+
},
|
|
136
|
+
fields: [orderInput, title, slugInput, image, description],
|
|
137
|
+
depth: 3,
|
|
138
|
+
})
|
|
139
139
|
`;
|
|
140
140
|
await fs.writeFile(categorySectionPath, categorySectionContent, 'utf-8');
|
|
141
141
|
}
|
|
@@ -147,55 +147,55 @@ export async function createSimpleSection(targetDir) {
|
|
|
147
147
|
const simpleSectionPath = path.join(sectionsDir, 'settings.section.ts');
|
|
148
148
|
// Ensure sections directory exists
|
|
149
149
|
await fs.ensureDir(sectionsDir);
|
|
150
|
-
const simpleSectionContent = `import { richTextField, textField } from 'nextjs-cms/core/fields'
|
|
151
|
-
import { simpleSection } from 'nextjs-cms/core/sections'
|
|
152
|
-
|
|
153
|
-
const facebook = textField({
|
|
154
|
-
name: 'facebook',
|
|
155
|
-
label: 'Facebook',
|
|
156
|
-
required: false,
|
|
157
|
-
order: 1,
|
|
158
|
-
})
|
|
159
|
-
|
|
160
|
-
const instagram = textField({
|
|
161
|
-
name: 'instagram',
|
|
162
|
-
label: 'Instagram',
|
|
163
|
-
required: false,
|
|
164
|
-
order: 2,
|
|
165
|
-
})
|
|
166
|
-
|
|
167
|
-
const twitter = textField({
|
|
168
|
-
name: 'twitter',
|
|
169
|
-
label: 'Twitter',
|
|
170
|
-
required: false,
|
|
171
|
-
order: 3,
|
|
172
|
-
})
|
|
173
|
-
|
|
174
|
-
const about = richTextField({
|
|
175
|
-
name: 'about',
|
|
176
|
-
label: 'About',
|
|
177
|
-
required: false,
|
|
178
|
-
order: 4,
|
|
179
|
-
})
|
|
180
|
-
|
|
181
|
-
const contact = richTextField({
|
|
182
|
-
name: 'contact',
|
|
183
|
-
label: 'Contact',
|
|
184
|
-
required: false,
|
|
185
|
-
order: 5,
|
|
186
|
-
})
|
|
187
|
-
|
|
188
|
-
export default simpleSection({
|
|
189
|
-
name: 'settings',
|
|
190
|
-
order: 3,
|
|
191
|
-
icon: 'settings',
|
|
192
|
-
readonly: false,
|
|
193
|
-
title: 'Site Settings',
|
|
194
|
-
db: {
|
|
195
|
-
table: 'settings',
|
|
196
|
-
},
|
|
197
|
-
fields: [facebook, instagram, twitter, about, contact],
|
|
198
|
-
})
|
|
150
|
+
const simpleSectionContent = `import { richTextField, textField } from 'nextjs-cms/core/fields'
|
|
151
|
+
import { simpleSection } from 'nextjs-cms/core/sections'
|
|
152
|
+
|
|
153
|
+
const facebook = textField({
|
|
154
|
+
name: 'facebook',
|
|
155
|
+
label: 'Facebook',
|
|
156
|
+
required: false,
|
|
157
|
+
order: 1,
|
|
158
|
+
})
|
|
159
|
+
|
|
160
|
+
const instagram = textField({
|
|
161
|
+
name: 'instagram',
|
|
162
|
+
label: 'Instagram',
|
|
163
|
+
required: false,
|
|
164
|
+
order: 2,
|
|
165
|
+
})
|
|
166
|
+
|
|
167
|
+
const twitter = textField({
|
|
168
|
+
name: 'twitter',
|
|
169
|
+
label: 'Twitter',
|
|
170
|
+
required: false,
|
|
171
|
+
order: 3,
|
|
172
|
+
})
|
|
173
|
+
|
|
174
|
+
const about = richTextField({
|
|
175
|
+
name: 'about',
|
|
176
|
+
label: 'About',
|
|
177
|
+
required: false,
|
|
178
|
+
order: 4,
|
|
179
|
+
})
|
|
180
|
+
|
|
181
|
+
const contact = richTextField({
|
|
182
|
+
name: 'contact',
|
|
183
|
+
label: 'Contact',
|
|
184
|
+
required: false,
|
|
185
|
+
order: 5,
|
|
186
|
+
})
|
|
187
|
+
|
|
188
|
+
export default simpleSection({
|
|
189
|
+
name: 'settings',
|
|
190
|
+
order: 3,
|
|
191
|
+
icon: 'settings',
|
|
192
|
+
readonly: false,
|
|
193
|
+
title: 'Site Settings',
|
|
194
|
+
db: {
|
|
195
|
+
table: 'settings',
|
|
196
|
+
},
|
|
197
|
+
fields: [facebook, instagram, twitter, about, contact],
|
|
198
|
+
})
|
|
199
199
|
`;
|
|
200
200
|
await fs.writeFile(simpleSectionPath, simpleSectionContent, 'utf-8');
|
|
201
201
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "create-nextjs-cms",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.2",
|
|
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/
|
|
33
|
-
"@lzcms/
|
|
32
|
+
"@lzcms/prettier-config": "0.1.0",
|
|
33
|
+
"@lzcms/tsconfig": "0.1.0"
|
|
34
34
|
},
|
|
35
35
|
"prettier": "@lzcms/prettier-config",
|
|
36
36
|
"scripts": {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
{
|
|
2
|
-
"extends": ["next/core-web-vitals", "prettier", "next", "plugin:drizzle/recommended"],
|
|
3
|
-
"parser": "@typescript-eslint/parser",
|
|
4
|
-
"plugins": ["@typescript-eslint", "prettier", "drizzle"]
|
|
5
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"extends": ["next/core-web-vitals", "prettier", "next", "plugin:drizzle/recommended"],
|
|
3
|
+
"parser": "@typescript-eslint/parser",
|
|
4
|
+
"plugins": ["@typescript-eslint", "prettier", "drizzle"]
|
|
5
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
build/*
|
|
2
|
-
dist/*
|
|
3
|
-
public/*
|
|
4
|
-
.next/*
|
|
5
|
-
node_modules/*
|
|
6
|
-
package.json
|
|
7
|
-
*.log
|
|
1
|
+
build/*
|
|
2
|
+
dist/*
|
|
3
|
+
public/*
|
|
4
|
+
.next/*
|
|
5
|
+
node_modules/*
|
|
6
|
+
package.json
|
|
7
|
+
*.log
|
|
@@ -1,27 +1,27 @@
|
|
|
1
|
-
{
|
|
2
|
-
"arrowParens": "always",
|
|
3
|
-
"bracketSpacing": true,
|
|
4
|
-
"embeddedLanguageFormatting": "auto",
|
|
5
|
-
"htmlWhitespaceSensitivity": "css",
|
|
6
|
-
"insertPragma": false,
|
|
7
|
-
"jsxSingleQuote": true,
|
|
8
|
-
"printWidth": 120,
|
|
9
|
-
"proseWrap": "preserve",
|
|
10
|
-
"quoteProps": "as-needed",
|
|
11
|
-
"requirePragma": false,
|
|
12
|
-
"semi": false,
|
|
13
|
-
"singleQuote": true,
|
|
14
|
-
"tabWidth": 4,
|
|
15
|
-
"trailingComma": "all",
|
|
16
|
-
"useTabs": false,
|
|
17
|
-
"vueIndentScriptAndStyle": false,
|
|
18
|
-
"overrides": [
|
|
19
|
-
{
|
|
20
|
-
"files": "*.json",
|
|
21
|
-
"options": {
|
|
22
|
-
"tabWidth": 4
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
],
|
|
26
|
-
"plugins": ["prettier-plugin-tailwindcss"]
|
|
27
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"arrowParens": "always",
|
|
3
|
+
"bracketSpacing": true,
|
|
4
|
+
"embeddedLanguageFormatting": "auto",
|
|
5
|
+
"htmlWhitespaceSensitivity": "css",
|
|
6
|
+
"insertPragma": false,
|
|
7
|
+
"jsxSingleQuote": true,
|
|
8
|
+
"printWidth": 120,
|
|
9
|
+
"proseWrap": "preserve",
|
|
10
|
+
"quoteProps": "as-needed",
|
|
11
|
+
"requirePragma": false,
|
|
12
|
+
"semi": false,
|
|
13
|
+
"singleQuote": true,
|
|
14
|
+
"tabWidth": 4,
|
|
15
|
+
"trailingComma": "all",
|
|
16
|
+
"useTabs": false,
|
|
17
|
+
"vueIndentScriptAndStyle": false,
|
|
18
|
+
"overrides": [
|
|
19
|
+
{
|
|
20
|
+
"files": "*.json",
|
|
21
|
+
"options": {
|
|
22
|
+
"tabWidth": 4
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
],
|
|
26
|
+
"plugins": ["prettier-plugin-tailwindcss"]
|
|
27
|
+
}
|