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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-vexcms",
3
- "version": "0.0.16",
3
+ "version": "0.0.17",
4
4
  "type": "module",
5
5
  "bin": {
6
6
  "create-vexcms": "./dist/index.js"
@@ -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.16",
26
- "@vexcms/better-auth": "~0.0.16",
27
- "@vexcms/core": "~0.0.16",
28
- "@vexcms/richtext": "~0.0.16",
29
- "@vexcms/ui": "~0.0.16",
30
- "@vexcms/file-storage-convex": "~0.0.16",
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.16",
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
  })