@bobbykim/manguito-cms-cli 0.1.0
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/dist/index.js +51852 -0
- package/dist/templates/.env.example.template +9 -0
- package/dist/templates/.gitignore.template +9 -0
- package/dist/templates/templates/.env.example.template +9 -0
- package/dist/templates/templates/.gitignore.template +9 -0
- package/dist/templates/templates/README.md.template +61 -0
- package/dist/templates/templates/manguito.config.ts.template +38 -0
- package/dist/templates/templates/package.json.template +23 -0
- package/dist/templates/templates/schemas/content-types/blog-post.json.template +67 -0
- package/dist/templates/templates/schemas/roles.json.template +60 -0
- package/dist/templates/templates/schemas/routes.json.template +5 -0
- package/dist/templates/templates/schemas/taxonomy-types/tag.json.template +19 -0
- package/dist/templates/templates/tsconfig.json.template +14 -0
- package/package.json +41 -0
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# {{projectName}}
|
|
2
|
+
|
|
3
|
+
A headless CMS project powered by [Manguito CMS](https://github.com/bobbykim89/manguito-cms).
|
|
4
|
+
|
|
5
|
+
## Getting started
|
|
6
|
+
|
|
7
|
+
1. Copy `.env.example` to `.env` and fill in your credentials:
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
cp .env.example .env
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
At minimum, set `DB_URL` and `AUTH_SECRET`.
|
|
14
|
+
|
|
15
|
+
2. Install dependencies:
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
pnpm install
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
3. Start the development server:
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
pnpm dev
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
The first run auto-migrates the database, seeds system roles, and prompts
|
|
28
|
+
you to create the first admin account.
|
|
29
|
+
|
|
30
|
+
Alternatively, run `pnpm migrate` then `pnpm exec manguito createsuperuser` to set up without starting the dev server.
|
|
31
|
+
|
|
32
|
+
## Commands
|
|
33
|
+
|
|
34
|
+
| Command | Description |
|
|
35
|
+
| ----------------- | ----------------------------------------------------- |
|
|
36
|
+
| `pnpm dev` | Start dev server with file watching and auto-migration |
|
|
37
|
+
| `pnpm build` | Run codegen and compile to `dist/` |
|
|
38
|
+
| `pnpm start` | Start production server from `dist/` |
|
|
39
|
+
| `pnpm migrate` | Apply pending database migrations |
|
|
40
|
+
| `pnpm validate` | Validate all schemas and config |
|
|
41
|
+
|
|
42
|
+
Other CLI commands (run via `pnpm exec manguito <command>`): `createsuperuser`, `users:promote`, `users:demote`, `migrate:status`.
|
|
43
|
+
|
|
44
|
+
## Project structure
|
|
45
|
+
|
|
46
|
+
```
|
|
47
|
+
schemas/
|
|
48
|
+
├── content-types/ ← Content type schema definitions
|
|
49
|
+
├── paragraph-types/ ← Reusable paragraph block definitions
|
|
50
|
+
├── taxonomy-types/ ← Taxonomy (tag/category) definitions
|
|
51
|
+
├── enum-types/ ← Enum type definitions
|
|
52
|
+
├── roles.json ← Role hierarchy and permissions
|
|
53
|
+
└── routes.json ← Public API route configuration
|
|
54
|
+
|
|
55
|
+
migrations/ ← Generated database migrations
|
|
56
|
+
|
|
57
|
+
.env.example ← Environment variable template
|
|
58
|
+
manguito.config.ts ← CMS configuration
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
Full documentation: https://github.com/bobbykim89/manguito-cms#readme
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { defineConfig } from '@bobbykim/manguito-cms-core'
|
|
2
|
+
import { createPostgresAdapter } from '@bobbykim/manguito-cms-db'
|
|
3
|
+
import {
|
|
4
|
+
createLocalAdapter,
|
|
5
|
+
createS3Adapter,
|
|
6
|
+
createCloudinaryAdapter,
|
|
7
|
+
} from '@bobbykim/manguito-cms-api/storage'
|
|
8
|
+
import { createServer, createAPIAdapter } from '@bobbykim/manguito-cms-api'
|
|
9
|
+
import { createAdminAdapter } from '@bobbykim/manguito-cms-admin'
|
|
10
|
+
|
|
11
|
+
export default defineConfig({
|
|
12
|
+
name: '{{projectName}}',
|
|
13
|
+
|
|
14
|
+
schema: {
|
|
15
|
+
base_path: './schemas',
|
|
16
|
+
},
|
|
17
|
+
|
|
18
|
+
db: createPostgresAdapter(),
|
|
19
|
+
|
|
20
|
+
migrations: {
|
|
21
|
+
table: '__manguito_migrations',
|
|
22
|
+
folder: './migrations',
|
|
23
|
+
},
|
|
24
|
+
|
|
25
|
+
// Storage — alternatives:
|
|
26
|
+
// createLocalAdapter({ upload_dir: process.env['STORAGE_LOCAL_UPLOAD_DIR'] })
|
|
27
|
+
// createS3Adapter({ bucket: process.env['STORAGE_S3_BUCKET'], region: process.env['STORAGE_S3_REGION'] })
|
|
28
|
+
// createCloudinaryAdapter({ cloud_name: process.env['CLOUDINARY_CLOUD_NAME'], access_key_id: process.env['CLOUDINARY_API_KEY'], secret_access_key: process.env['CLOUDINARY_API_SECRET'] })
|
|
29
|
+
storage: {{storageAdapter}},
|
|
30
|
+
|
|
31
|
+
server: createServer({
|
|
32
|
+
cors: { origin: process.env['ALLOWED_ORIGIN'] ?? '*' },
|
|
33
|
+
}),
|
|
34
|
+
|
|
35
|
+
api: createAPIAdapter({ prefix: '/api' }),
|
|
36
|
+
|
|
37
|
+
admin: createAdminAdapter({ prefix: '/admin' }),
|
|
38
|
+
})
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "{{projectName}}",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"private": true,
|
|
5
|
+
"type": "module",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"dev": "manguito dev",
|
|
8
|
+
"build": "manguito build",
|
|
9
|
+
"start": "manguito start",
|
|
10
|
+
"migrate": "manguito migrate",
|
|
11
|
+
"validate": "manguito validate"
|
|
12
|
+
},
|
|
13
|
+
"dependencies": {
|
|
14
|
+
"@bobbykim/manguito-cms-admin": "latest",
|
|
15
|
+
"@bobbykim/manguito-cms-api": "latest",
|
|
16
|
+
"@bobbykim/manguito-cms-cli": "latest",
|
|
17
|
+
"@bobbykim/manguito-cms-core": "latest",
|
|
18
|
+
"@bobbykim/manguito-cms-db": "latest"
|
|
19
|
+
},
|
|
20
|
+
"engines": {
|
|
21
|
+
"node": ">=22.0.0"
|
|
22
|
+
}
|
|
23
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "content--blog_post",
|
|
3
|
+
"label": "Blog Post",
|
|
4
|
+
"type": "content-type",
|
|
5
|
+
"default_base_path": "posts",
|
|
6
|
+
"only_one": false,
|
|
7
|
+
"fields": [
|
|
8
|
+
{
|
|
9
|
+
"tab": {
|
|
10
|
+
"name": "content",
|
|
11
|
+
"label": "Content",
|
|
12
|
+
"fields": [
|
|
13
|
+
{
|
|
14
|
+
"name": "blog_title",
|
|
15
|
+
"label": "Title",
|
|
16
|
+
"type": "text/plain",
|
|
17
|
+
"required": true
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"name": "blog_slug",
|
|
21
|
+
"label": "Slug",
|
|
22
|
+
"type": "text/plain",
|
|
23
|
+
"required": true
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"name": "blog_hero_image",
|
|
27
|
+
"label": "Hero Image",
|
|
28
|
+
"type": "image",
|
|
29
|
+
"required": false
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"name": "blog_body",
|
|
33
|
+
"label": "Body",
|
|
34
|
+
"type": "text/rich",
|
|
35
|
+
"required": true
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
"name": "blog_published",
|
|
39
|
+
"label": "Published",
|
|
40
|
+
"type": "boolean",
|
|
41
|
+
"required": false
|
|
42
|
+
}
|
|
43
|
+
]
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
"tab": {
|
|
48
|
+
"name": "seo",
|
|
49
|
+
"label": "SEO",
|
|
50
|
+
"fields": [
|
|
51
|
+
{
|
|
52
|
+
"name": "blog_meta_title",
|
|
53
|
+
"label": "Meta Title",
|
|
54
|
+
"type": "text/plain",
|
|
55
|
+
"required": false
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
"name": "blog_meta_desc",
|
|
59
|
+
"label": "Meta Description",
|
|
60
|
+
"type": "text/plain",
|
|
61
|
+
"required": false
|
|
62
|
+
}
|
|
63
|
+
]
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
]
|
|
67
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
{
|
|
2
|
+
"roles": [
|
|
3
|
+
{
|
|
4
|
+
"name": "admin",
|
|
5
|
+
"label": "Administrator",
|
|
6
|
+
"is_system": true,
|
|
7
|
+
"hierarchy_level": 0,
|
|
8
|
+
"permissions": [
|
|
9
|
+
"content:read", "content:create", "content:edit", "content:delete",
|
|
10
|
+
"media:read", "media:create", "media:edit", "media:delete",
|
|
11
|
+
"taxonomy:read", "taxonomy:create", "taxonomy:edit", "taxonomy:delete",
|
|
12
|
+
"users:read", "users:create", "users:edit", "users:delete",
|
|
13
|
+
"roles:read"
|
|
14
|
+
]
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"name": "manager",
|
|
18
|
+
"label": "Manager",
|
|
19
|
+
"is_system": true,
|
|
20
|
+
"hierarchy_level": 1,
|
|
21
|
+
"permissions": [
|
|
22
|
+
"content:read", "content:create", "content:edit", "content:delete",
|
|
23
|
+
"media:read", "media:create", "media:edit", "media:delete",
|
|
24
|
+
"taxonomy:read", "taxonomy:create", "taxonomy:edit", "taxonomy:delete",
|
|
25
|
+
"users:read"
|
|
26
|
+
]
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"name": "editor",
|
|
30
|
+
"label": "Editor",
|
|
31
|
+
"is_system": true,
|
|
32
|
+
"hierarchy_level": 2,
|
|
33
|
+
"permissions": [
|
|
34
|
+
"content:read", "content:create", "content:edit", "content:delete",
|
|
35
|
+
"media:read", "media:create", "media:edit", "media:delete",
|
|
36
|
+
"taxonomy:read", "taxonomy:create", "taxonomy:edit", "taxonomy:delete"
|
|
37
|
+
]
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
"name": "writer",
|
|
41
|
+
"label": "Writer",
|
|
42
|
+
"is_system": true,
|
|
43
|
+
"hierarchy_level": 3,
|
|
44
|
+
"permissions": [
|
|
45
|
+
"content:read", "content:create",
|
|
46
|
+
"media:read", "media:create"
|
|
47
|
+
]
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
"name": "viewer",
|
|
51
|
+
"label": "Viewer",
|
|
52
|
+
"is_system": true,
|
|
53
|
+
"hierarchy_level": 4,
|
|
54
|
+
"permissions": [
|
|
55
|
+
"content:read",
|
|
56
|
+
"media:read"
|
|
57
|
+
]
|
|
58
|
+
}
|
|
59
|
+
]
|
|
60
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "taxonomy--tag",
|
|
3
|
+
"label": "Tag",
|
|
4
|
+
"type": "taxonomy-type",
|
|
5
|
+
"fields": [
|
|
6
|
+
{
|
|
7
|
+
"name": "tag_name",
|
|
8
|
+
"label": "Name",
|
|
9
|
+
"type": "text/plain",
|
|
10
|
+
"required": true
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
"name": "tag_slug",
|
|
14
|
+
"label": "Slug",
|
|
15
|
+
"type": "text/plain",
|
|
16
|
+
"required": true
|
|
17
|
+
}
|
|
18
|
+
]
|
|
19
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json.schemastore.org/tsconfig",
|
|
3
|
+
"compilerOptions": {
|
|
4
|
+
"target": "ES2022",
|
|
5
|
+
"module": "NodeNext",
|
|
6
|
+
"moduleResolution": "NodeNext",
|
|
7
|
+
"lib": ["ES2022"],
|
|
8
|
+
"strict": true,
|
|
9
|
+
"noUncheckedIndexedAccess": true,
|
|
10
|
+
"skipLibCheck": true,
|
|
11
|
+
"esModuleInterop": true
|
|
12
|
+
},
|
|
13
|
+
"include": ["manguito.config.ts"]
|
|
14
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@bobbykim/manguito-cms-cli",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"bin": {
|
|
6
|
+
"manguito": "./dist/index.js"
|
|
7
|
+
},
|
|
8
|
+
"exports": {
|
|
9
|
+
".": "./dist/index.js"
|
|
10
|
+
},
|
|
11
|
+
"files": [
|
|
12
|
+
"dist"
|
|
13
|
+
],
|
|
14
|
+
"engines": {
|
|
15
|
+
"node": ">=22.0.0"
|
|
16
|
+
},
|
|
17
|
+
"dependencies": {
|
|
18
|
+
"@inquirer/prompts": "^7.10.1",
|
|
19
|
+
"commander": "^12.1.0",
|
|
20
|
+
"dotenv": "^16.6.1",
|
|
21
|
+
"tsup": "^8.5.1",
|
|
22
|
+
"vite": "^6.4.3",
|
|
23
|
+
"@bobbykim/manguito-cms-admin": "0.1.0",
|
|
24
|
+
"@bobbykim/manguito-cms-db": "0.1.0",
|
|
25
|
+
"@bobbykim/manguito-cms-core": "0.1.0",
|
|
26
|
+
"@bobbykim/manguito-cms-api": "0.1.0"
|
|
27
|
+
},
|
|
28
|
+
"devDependencies": {
|
|
29
|
+
"@types/node": "^25.9.5",
|
|
30
|
+
"dotenv-cli": "latest",
|
|
31
|
+
"tsup": "^8.5.0",
|
|
32
|
+
"typescript": "^6.0.3",
|
|
33
|
+
"vitest": "^4.1.10"
|
|
34
|
+
},
|
|
35
|
+
"scripts": {
|
|
36
|
+
"build": "tsup",
|
|
37
|
+
"dev": "tsup --watch",
|
|
38
|
+
"test": "dotenv -e .env.test -- vitest run",
|
|
39
|
+
"lint": "eslint src"
|
|
40
|
+
}
|
|
41
|
+
}
|