create-vexcms 0.0.16 → 0.0.17
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/package.json
CHANGED
|
@@ -22,12 +22,12 @@
|
|
|
22
22
|
"@t3-oss/env-nextjs": "^0.13.10",
|
|
23
23
|
"@tanstack/react-form": "^1.27.7",
|
|
24
24
|
"@tanstack/react-query": "^5.90.17",
|
|
25
|
-
"@vexcms/admin-next": "~0.0.
|
|
26
|
-
"@vexcms/better-auth": "~0.0.
|
|
27
|
-
"@vexcms/core": "~0.0.
|
|
28
|
-
"@vexcms/richtext": "~0.0.
|
|
29
|
-
"@vexcms/ui": "~0.0.
|
|
30
|
-
"@vexcms/file-storage-convex": "~0.0.
|
|
25
|
+
"@vexcms/admin-next": "~0.0.17",
|
|
26
|
+
"@vexcms/better-auth": "~0.0.17",
|
|
27
|
+
"@vexcms/core": "~0.0.17",
|
|
28
|
+
"@vexcms/richtext": "~0.0.17",
|
|
29
|
+
"@vexcms/ui": "~0.0.17",
|
|
30
|
+
"@vexcms/file-storage-convex": "~0.0.17",
|
|
31
31
|
"better-auth": ">=1.4.9 <1.5.0",
|
|
32
32
|
"class-variance-authority": "^0.7.1",
|
|
33
33
|
"clsx": "^2.1.1",
|
|
@@ -54,7 +54,7 @@
|
|
|
54
54
|
"@types/node": "^20",
|
|
55
55
|
"@types/react": "^19",
|
|
56
56
|
"@types/react-dom": "^19",
|
|
57
|
-
"@vexcms/cli": "~0.0.
|
|
57
|
+
"@vexcms/cli": "~0.0.17",
|
|
58
58
|
"babel-plugin-react-compiler": "^1.0.0",
|
|
59
59
|
"eslint": "^9",
|
|
60
60
|
"eslint-config-next": "15.5.9",
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { internalMutation } from "./_generated/server"
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Initialize the site with default data.
|
|
5
|
+
*
|
|
6
|
+
* Run from terminal:
|
|
7
|
+
* npx convex run seed:init
|
|
8
|
+
*
|
|
9
|
+
* Creates:
|
|
10
|
+
* - Site settings global (required for theme and SEO)
|
|
11
|
+
* - A default header
|
|
12
|
+
* - A default footer
|
|
13
|
+
*
|
|
14
|
+
* Safe to run multiple times — skips items that already exist.
|
|
15
|
+
*/
|
|
16
|
+
export const init = internalMutation({
|
|
17
|
+
args: {},
|
|
18
|
+
handler: async (ctx) => {
|
|
19
|
+
const created: string[] = []
|
|
20
|
+
const skipped: string[] = []
|
|
21
|
+
|
|
22
|
+
// Site Settings
|
|
23
|
+
const existingSettings = await ctx.db.query("site_settings").first()
|
|
24
|
+
if (existingSettings) {
|
|
25
|
+
skipped.push("site_settings")
|
|
26
|
+
} else {
|
|
27
|
+
await ctx.db.insert("site_settings", {
|
|
28
|
+
name: "My Site",
|
|
29
|
+
vex_status: "published",
|
|
30
|
+
vex_version: 1,
|
|
31
|
+
vex_publishedAt: Date.now(),
|
|
32
|
+
})
|
|
33
|
+
created.push("site_settings")
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// Default Header
|
|
37
|
+
const existingHeader = await ctx.db
|
|
38
|
+
.query("headers")
|
|
39
|
+
.withIndex("by_name", (q) => q.eq("name", "Main Header"))
|
|
40
|
+
.first()
|
|
41
|
+
if (existingHeader) {
|
|
42
|
+
skipped.push("header")
|
|
43
|
+
} else {
|
|
44
|
+
await ctx.db.insert("headers", {
|
|
45
|
+
name: "Main Header",
|
|
46
|
+
vex_status: "published",
|
|
47
|
+
content: [
|
|
48
|
+
{
|
|
49
|
+
blockType: "header",
|
|
50
|
+
blockName: "Site Header",
|
|
51
|
+
_key: "main-header",
|
|
52
|
+
logoText: "My Site",
|
|
53
|
+
logoHref: "/",
|
|
54
|
+
menuItems: [
|
|
55
|
+
{ label: "Features", href: "/features" },
|
|
56
|
+
{ label: "Docs", href: "/docs" },
|
|
57
|
+
],
|
|
58
|
+
actionButtons: [
|
|
59
|
+
{ label: "Get Started", href: "/docs", variant: "default" as const },
|
|
60
|
+
],
|
|
61
|
+
},
|
|
62
|
+
],
|
|
63
|
+
})
|
|
64
|
+
created.push("header")
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// Default Footer
|
|
68
|
+
const existingFooter = await ctx.db
|
|
69
|
+
.query("footers")
|
|
70
|
+
.withIndex("by_name", (q) => q.eq("name", "Main Footer"))
|
|
71
|
+
.first()
|
|
72
|
+
if (existingFooter) {
|
|
73
|
+
skipped.push("footer")
|
|
74
|
+
} else {
|
|
75
|
+
await ctx.db.insert("footers", {
|
|
76
|
+
name: "Main Footer",
|
|
77
|
+
vex_status: "published",
|
|
78
|
+
content: [
|
|
79
|
+
{
|
|
80
|
+
blockType: "footer",
|
|
81
|
+
blockName: "Site Footer",
|
|
82
|
+
_key: "main-footer",
|
|
83
|
+
logoText: "My Site",
|
|
84
|
+
copyright: "My Site. All rights reserved.",
|
|
85
|
+
links: [
|
|
86
|
+
{ label: "Home", href: "/" },
|
|
87
|
+
],
|
|
88
|
+
socialLinks: [],
|
|
89
|
+
},
|
|
90
|
+
],
|
|
91
|
+
})
|
|
92
|
+
created.push("footer")
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
return {
|
|
96
|
+
created,
|
|
97
|
+
skipped,
|
|
98
|
+
message: `Initialized ${created.length} items. Skipped ${skipped.length} (already exist).`,
|
|
99
|
+
}
|
|
100
|
+
},
|
|
101
|
+
})
|
|
@@ -1,15 +1,26 @@
|
|
|
1
1
|
import { defineAccess } from "@vexcms/core"
|
|
2
2
|
|
|
3
3
|
import { TABLE_SLUG_USERS, USER_ROLES } from "~/db/constants"
|
|
4
|
-
import { users } from "~/vexcms/collections"
|
|
4
|
+
import { footers, headers, media, pages, themes, users } from "~/vexcms/collections"
|
|
5
|
+
import { siteSettings } from "~/vexcms/globals"
|
|
5
6
|
|
|
6
7
|
export const access = defineAccess({
|
|
8
|
+
roles: [USER_ROLES.admin, USER_ROLES.user],
|
|
9
|
+
resources: [pages, headers, footers, themes, users, media, siteSettings],
|
|
10
|
+
userCollection: users,
|
|
7
11
|
permissions: {
|
|
8
12
|
admin: {
|
|
9
13
|
admin: true,
|
|
14
|
+
pages: true,
|
|
15
|
+
headers: true,
|
|
16
|
+
footers: true,
|
|
17
|
+
themes: true,
|
|
10
18
|
user: true,
|
|
19
|
+
media: true,
|
|
20
|
+
site_settings: true,
|
|
11
21
|
},
|
|
12
22
|
user: {
|
|
23
|
+
admin: false,
|
|
13
24
|
[TABLE_SLUG_USERS]: {
|
|
14
25
|
create: false,
|
|
15
26
|
delete: false,
|
|
@@ -22,7 +33,4 @@ export const access = defineAccess({
|
|
|
22
33
|
},
|
|
23
34
|
},
|
|
24
35
|
},
|
|
25
|
-
resources: [users],
|
|
26
|
-
roles: [USER_ROLES.user, USER_ROLES.admin],
|
|
27
|
-
userCollection: users,
|
|
28
36
|
})
|