@vilio/blog-module 0.0.3 → 0.0.5
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/actions/index.d.ts +177 -7
- package/dist/actions/index.d.ts.map +1 -0
- package/dist/actions/index.js +341 -0
- package/dist/actions/index.js.map +1 -0
- package/dist/components/BlogStatsWidget.d.ts +2 -2
- package/dist/components/BlogStatsWidget.d.ts.map +1 -0
- package/dist/components/BlogStatsWidget.js +18 -0
- package/dist/components/BlogStatsWidget.js.map +1 -0
- package/dist/components/RecentCommentsWidget.d.ts +2 -2
- package/dist/components/RecentCommentsWidget.d.ts.map +1 -0
- package/dist/components/RecentCommentsWidget.js +25 -0
- package/dist/components/RecentCommentsWidget.js.map +1 -0
- package/dist/components/RecentPostsWidget.d.ts +2 -2
- package/dist/components/RecentPostsWidget.d.ts.map +1 -0
- package/dist/components/RecentPostsWidget.js +25 -0
- package/dist/components/RecentPostsWidget.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +108 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/validation.d.ts +51 -4
- package/dist/lib/validation.d.ts.map +1 -0
- package/dist/lib/validation.js +57 -0
- package/dist/lib/validation.js.map +1 -0
- package/dist/navigation.d.ts +1 -0
- package/dist/navigation.d.ts.map +1 -0
- package/dist/navigation.js +43 -0
- package/dist/navigation.js.map +1 -0
- package/dist/routes.d.ts +1 -0
- package/dist/routes.d.ts.map +1 -0
- package/dist/routes.js +121 -0
- package/dist/routes.js.map +1 -0
- package/dist/schema.d.ts +491 -128
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +168 -0
- package/dist/schema.js.map +1 -0
- package/dist/ui/views.d.ts +15 -6
- package/dist/ui/views.d.ts.map +1 -0
- package/dist/ui/views.js +204 -0
- package/dist/ui/views.js.map +1 -0
- package/locales/en/global.json +28 -1
- package/locales/pl/global.json +36 -9
- package/package.json +16 -26
- package/dist/actions/index.cjs +0 -158
- package/dist/actions/index.mjs +0 -121
- package/dist/components/BlogStatsWidget.cjs +0 -45
- package/dist/components/BlogStatsWidget.mjs +0 -13
- package/dist/components/RecentCommentsWidget.cjs +0 -47
- package/dist/components/RecentCommentsWidget.mjs +0 -28
- package/dist/components/RecentPostsWidget.cjs +0 -47
- package/dist/components/RecentPostsWidget.mjs +0 -28
- package/dist/components/ui/button.cjs +0 -54
- package/dist/components/ui/button.d.ts +0 -11
- package/dist/components/ui/button.mjs +0 -47
- package/dist/components/ui/card.cjs +0 -47
- package/dist/components/ui/card.d.ts +0 -6
- package/dist/components/ui/card.mjs +0 -36
- package/dist/components/ui/input.cjs +0 -24
- package/dist/components/ui/input.d.ts +0 -5
- package/dist/components/ui/input.mjs +0 -17
- package/dist/components/ui/table.cjs +0 -68
- package/dist/components/ui/table.d.ts +0 -8
- package/dist/components/ui/table.mjs +0 -65
- package/dist/components/ui/textarea.cjs +0 -22
- package/dist/components/ui/textarea.d.ts +0 -5
- package/dist/components/ui/textarea.mjs +0 -16
- package/dist/index.cjs +0 -102
- package/dist/index.mjs +0 -97
- package/dist/intl.d.ts +0 -7
- package/dist/lib/utils.cjs +0 -11
- package/dist/lib/utils.d.ts +0 -2
- package/dist/lib/utils.mjs +0 -5
- package/dist/lib/validation.cjs +0 -16
- package/dist/lib/validation.mjs +0 -10
- package/dist/navigation.cjs +0 -23
- package/dist/navigation.mjs +0 -21
- package/dist/routes.cjs +0 -74
- package/dist/routes.mjs +0 -68
- package/dist/schema.cjs +0 -62
- package/dist/schema.mjs +0 -53
- package/dist/styles/globals.css +0 -1
- package/dist/ui/views.cjs +0 -448
- package/dist/ui/views.mjs +0 -237
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { db, userTable } from "@vilio/core/server";
|
|
3
|
+
import { getTranslation } from "@vilio/intl/server";
|
|
4
|
+
import { Avatar, AvatarFallback, AvatarImage, Card, CardContent, CardDescription, CardHeader, CardTitle, } from "@vilio/ui";
|
|
5
|
+
import { desc, eq } from "drizzle-orm";
|
|
6
|
+
import { postsTable } from "../schema";
|
|
7
|
+
export default async function RecentPostsWidget() {
|
|
8
|
+
const { t } = await getTranslation();
|
|
9
|
+
const posts = await db
|
|
10
|
+
.select({
|
|
11
|
+
id: postsTable.id,
|
|
12
|
+
title: postsTable.title,
|
|
13
|
+
createdAt: postsTable.createdAt,
|
|
14
|
+
author: {
|
|
15
|
+
name: userTable.name,
|
|
16
|
+
image: userTable.image,
|
|
17
|
+
},
|
|
18
|
+
})
|
|
19
|
+
.from(postsTable)
|
|
20
|
+
.leftJoin(userTable, eq(postsTable.authorId, userTable.id))
|
|
21
|
+
.orderBy(desc(postsTable.createdAt))
|
|
22
|
+
.limit(5);
|
|
23
|
+
return (_jsxs(Card, { children: [_jsxs(CardHeader, { children: [_jsx(CardTitle, { children: t("Recent Posts") }), _jsx(CardDescription, { children: t("The latest articles published on your blog.") })] }), _jsxs(CardContent, { className: "grid gap-8", children: [posts.map((post) => (_jsxs("div", { className: "flex items-center gap-4", children: [_jsxs(Avatar, { className: "h-9 w-9", children: [_jsx(AvatarImage, { src: post.author?.image || "", alt: "Avatar" }), _jsx(AvatarFallback, { children: post.author?.name?.substring(0, 2).toUpperCase() || "AU" })] }), _jsxs("div", { className: "grid gap-1", children: [_jsx("p", { className: "text-sm font-medium leading-none", children: post.title }), _jsx("p", { className: "text-sm text-muted-foreground", children: new Date(post.createdAt).toLocaleDateString() })] })] }, post.id))), posts.length === 0 && (_jsx("div", { className: "text-center py-4 text-muted-foreground", children: t("No posts found.") }))] })] }));
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=RecentPostsWidget.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RecentPostsWidget.js","sourceRoot":"","sources":["../../src/components/RecentPostsWidget.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EACL,MAAM,EACN,cAAc,EACd,WAAW,EACX,IAAI,EACJ,WAAW,EACX,eAAe,EACf,UAAU,EACV,SAAS,GACV,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAEvC,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEvC,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,iBAAiB;IAC7C,MAAM,EAAE,CAAC,EAAE,GAAG,MAAM,cAAc,EAAE,CAAC;IAErC,MAAM,KAAK,GAAG,MAAM,EAAE;SACnB,MAAM,CAAC;QACN,EAAE,EAAE,UAAU,CAAC,EAAE;QACjB,KAAK,EAAE,UAAU,CAAC,KAAK;QACvB,SAAS,EAAE,UAAU,CAAC,SAAS;QAC/B,MAAM,EAAE;YACN,IAAI,EAAE,SAAS,CAAC,IAAI;YACpB,KAAK,EAAE,SAAS,CAAC,KAAK;SACvB;KACF,CAAC;SACD,IAAI,CAAC,UAAU,CAAC;SAChB,QAAQ,CAAC,SAAS,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC;SAC1D,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;SACnC,KAAK,CAAC,CAAC,CAAC,CAAC;IAEZ,OAAO,CACL,MAAC,IAAI,eACH,MAAC,UAAU,eACT,KAAC,SAAS,cAAE,CAAC,CAAC,cAAc,CAAC,GAAa,EAC1C,KAAC,eAAe,cACb,CAAC,CAAC,6CAA6C,CAAC,GACjC,IACP,EACb,MAAC,WAAW,IAAC,SAAS,EAAC,YAAY,aAChC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CACnB,eAAmB,SAAS,EAAC,yBAAyB,aACpD,MAAC,MAAM,IAAC,SAAS,EAAC,SAAS,aACzB,KAAC,WAAW,IAAC,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,EAAE,EAAE,GAAG,EAAC,QAAQ,GAAG,EAC3D,KAAC,cAAc,cACZ,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,IAAI,IAAI,GAC1C,IACV,EACT,eAAK,SAAS,EAAC,YAAY,aACzB,YAAG,SAAS,EAAC,kCAAkC,YAAE,IAAI,CAAC,KAAK,GAAK,EAChE,YAAG,SAAS,EAAC,+BAA+B,YACzC,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,kBAAkB,EAAE,GAC5C,IACA,KAZE,IAAI,CAAC,EAAE,CAaX,CACP,CAAC,EACD,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,CACrB,cAAK,SAAS,EAAC,wCAAwC,YACpD,CAAC,CAAC,iBAAiB,CAAC,GACjB,CACP,IACW,IACT,CACR,CAAC;AACJ,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAqB9C,QAAA,MAAM,UAAU,EAAE,OAoGjB,CAAC;AAEF,cAAc,UAAU,CAAC;AACzB,eAAe,UAAU,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { assignPermissionToRole, createPermission, db, getRoles, permissionsTable, } from "@vilio/core/server";
|
|
2
|
+
import { inArray, sql } from "drizzle-orm";
|
|
3
|
+
import localesEn from "../locales/en/global.json" with { type: "json" };
|
|
4
|
+
import localesPl from "../locales/pl/global.json" with { type: "json" };
|
|
5
|
+
import manifest from "../manifest.json" with { type: "json" };
|
|
6
|
+
import BlogStatsWidget from "./components/BlogStatsWidget";
|
|
7
|
+
import RecentCommentsWidget from "./components/RecentCommentsWidget";
|
|
8
|
+
import RecentPostsWidget from "./components/RecentPostsWidget";
|
|
9
|
+
import { navigation } from "./navigation";
|
|
10
|
+
import { privateRoutes, publicRoutes } from "./routes";
|
|
11
|
+
const BLOG_PERMISSIONS = [
|
|
12
|
+
{ name: "post:create", description: "Allow creating blog posts" },
|
|
13
|
+
{ name: "post:update", description: "Allow updating blog posts" },
|
|
14
|
+
{ name: "post:delete", description: "Allow deleting blog posts" },
|
|
15
|
+
{ name: "comment:create", description: "Allow creating comments" },
|
|
16
|
+
{ name: "comment:update", description: "Allow updating comments" },
|
|
17
|
+
{ name: "comment:delete", description: "Allow deleting comments" },
|
|
18
|
+
];
|
|
19
|
+
// --- Module Definition ---
|
|
20
|
+
const blogModule = {
|
|
21
|
+
manifest: manifest,
|
|
22
|
+
translations: {
|
|
23
|
+
en: localesEn,
|
|
24
|
+
pl: localesPl,
|
|
25
|
+
},
|
|
26
|
+
init: async () => {
|
|
27
|
+
console.log("[BlogModule] ready.");
|
|
28
|
+
},
|
|
29
|
+
widgets: [
|
|
30
|
+
{
|
|
31
|
+
id: "blog-stats",
|
|
32
|
+
name: "Blog Stats",
|
|
33
|
+
area: "dashboard-stats",
|
|
34
|
+
component: BlogStatsWidget,
|
|
35
|
+
priority: 20,
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
id: "recent-posts",
|
|
39
|
+
name: "Recent Posts",
|
|
40
|
+
area: "dashboard-main",
|
|
41
|
+
component: RecentPostsWidget,
|
|
42
|
+
priority: 20,
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
id: "recent-comments",
|
|
46
|
+
name: "Recent Comments",
|
|
47
|
+
area: "dashboard-main",
|
|
48
|
+
component: RecentCommentsWidget,
|
|
49
|
+
priority: 30,
|
|
50
|
+
},
|
|
51
|
+
],
|
|
52
|
+
onEnable: async () => {
|
|
53
|
+
console.log("[BlogModule] enabling and registering permissions...");
|
|
54
|
+
try {
|
|
55
|
+
// 1. Create permissions
|
|
56
|
+
for (const perm of BLOG_PERMISSIONS) {
|
|
57
|
+
await createPermission(perm.name, perm.description);
|
|
58
|
+
}
|
|
59
|
+
// 2. Assign to admin role
|
|
60
|
+
const roles = await getRoles();
|
|
61
|
+
const adminRole = roles.find((r) => r.name === "admin");
|
|
62
|
+
if (adminRole) {
|
|
63
|
+
const blogPermNames = BLOG_PERMISSIONS.map((p) => p.name);
|
|
64
|
+
const blogPerms = await db
|
|
65
|
+
.select()
|
|
66
|
+
.from(permissionsTable)
|
|
67
|
+
.where(inArray(permissionsTable.name, blogPermNames));
|
|
68
|
+
for (const p of blogPerms) {
|
|
69
|
+
await assignPermissionToRole(adminRole.id, p.id);
|
|
70
|
+
}
|
|
71
|
+
console.log("[BlogModule] Permissions assigned to admin role.");
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
console.error("[BlogModule] Error during permission registration:", error);
|
|
76
|
+
}
|
|
77
|
+
console.log("[BlogModule] enabled.");
|
|
78
|
+
},
|
|
79
|
+
onDisable: async () => {
|
|
80
|
+
console.log("[Blog] onDisable: Cleaning up tables and permissions...");
|
|
81
|
+
try {
|
|
82
|
+
// 1. Remove permissions (cascades to role-permission mappings)
|
|
83
|
+
const blogPermNames = BLOG_PERMISSIONS.map((p) => p.name);
|
|
84
|
+
await db
|
|
85
|
+
.delete(permissionsTable)
|
|
86
|
+
.where(inArray(permissionsTable.name, blogPermNames));
|
|
87
|
+
console.log("[BlogModule] Permissions and mappings removed.");
|
|
88
|
+
// 2. Drop tables
|
|
89
|
+
await db.execute(sql.raw(`DROP TABLE IF EXISTS blog_categories CASCADE`));
|
|
90
|
+
await db.execute(sql.raw(`DROP TABLE IF EXISTS blog_tags CASCADE`));
|
|
91
|
+
await db.execute(sql.raw(`DROP TABLE IF EXISTS blog_posts CASCADE`));
|
|
92
|
+
await db.execute(sql.raw(`DROP TABLE IF EXISTS blog_post_tags CASCADE`));
|
|
93
|
+
await db.execute(sql.raw(`DROP TABLE IF EXISTS blog_comments CASCADE`));
|
|
94
|
+
console.log("[BlogModule] tables removed.");
|
|
95
|
+
}
|
|
96
|
+
catch (e) {
|
|
97
|
+
console.error("[Blog] onDisable Error:", e);
|
|
98
|
+
}
|
|
99
|
+
},
|
|
100
|
+
routes: {
|
|
101
|
+
public: publicRoutes,
|
|
102
|
+
private: privateRoutes,
|
|
103
|
+
},
|
|
104
|
+
navigation: navigation,
|
|
105
|
+
};
|
|
106
|
+
export * from "./schema";
|
|
107
|
+
export default blogModule;
|
|
108
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/validation.d.ts
CHANGED
|
@@ -1,24 +1,71 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
+
export declare const postStatusSchema: z.ZodEnum<["draft", "published", "archived", "scheduled"]>;
|
|
3
|
+
export declare const commentStatusSchema: z.ZodEnum<["pending", "approved", "spam", "trash"]>;
|
|
4
|
+
export declare const categorySchema: z.ZodObject<{
|
|
5
|
+
name: z.ZodString;
|
|
6
|
+
slug: z.ZodString;
|
|
7
|
+
description: z.ZodOptional<z.ZodString>;
|
|
8
|
+
}, "strip", z.ZodTypeAny, {
|
|
9
|
+
name: string;
|
|
10
|
+
slug: string;
|
|
11
|
+
description?: string | undefined;
|
|
12
|
+
}, {
|
|
13
|
+
name: string;
|
|
14
|
+
slug: string;
|
|
15
|
+
description?: string | undefined;
|
|
16
|
+
}>;
|
|
17
|
+
export declare const tagSchema: z.ZodObject<{
|
|
18
|
+
name: z.ZodString;
|
|
19
|
+
slug: z.ZodString;
|
|
20
|
+
}, "strip", z.ZodTypeAny, {
|
|
21
|
+
name: string;
|
|
22
|
+
slug: string;
|
|
23
|
+
}, {
|
|
24
|
+
name: string;
|
|
25
|
+
slug: string;
|
|
26
|
+
}>;
|
|
2
27
|
export declare const postSchema: z.ZodObject<{
|
|
3
28
|
title: z.ZodString;
|
|
4
|
-
content: z.ZodString;
|
|
5
29
|
slug: z.ZodString;
|
|
30
|
+
excerpt: z.ZodOptional<z.ZodString>;
|
|
31
|
+
content: z.ZodString;
|
|
32
|
+
coverImage: z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodLiteral<"">]>>;
|
|
33
|
+
status: z.ZodDefault<z.ZodEnum<["draft", "published", "archived", "scheduled"]>>;
|
|
34
|
+
categoryId: z.ZodNullable<z.ZodOptional<z.ZodString>>;
|
|
35
|
+
tags: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
36
|
+
publishedAt: z.ZodNullable<z.ZodOptional<z.ZodDate>>;
|
|
6
37
|
}, "strip", z.ZodTypeAny, {
|
|
38
|
+
slug: string;
|
|
7
39
|
title: string;
|
|
8
40
|
content: string;
|
|
9
|
-
|
|
41
|
+
status: "draft" | "published" | "archived" | "scheduled";
|
|
42
|
+
excerpt?: string | undefined;
|
|
43
|
+
coverImage?: string | undefined;
|
|
44
|
+
categoryId?: string | null | undefined;
|
|
45
|
+
publishedAt?: Date | null | undefined;
|
|
46
|
+
tags?: string[] | undefined;
|
|
10
47
|
}, {
|
|
48
|
+
slug: string;
|
|
11
49
|
title: string;
|
|
12
50
|
content: string;
|
|
13
|
-
|
|
51
|
+
excerpt?: string | undefined;
|
|
52
|
+
coverImage?: string | undefined;
|
|
53
|
+
status?: "draft" | "published" | "archived" | "scheduled" | undefined;
|
|
54
|
+
categoryId?: string | null | undefined;
|
|
55
|
+
publishedAt?: Date | null | undefined;
|
|
56
|
+
tags?: string[] | undefined;
|
|
14
57
|
}>;
|
|
15
58
|
export declare const commentSchema: z.ZodObject<{
|
|
16
|
-
content: z.ZodString;
|
|
17
59
|
postId: z.ZodString;
|
|
60
|
+
parentId: z.ZodNullable<z.ZodOptional<z.ZodString>>;
|
|
61
|
+
content: z.ZodString;
|
|
18
62
|
}, "strip", z.ZodTypeAny, {
|
|
19
63
|
content: string;
|
|
20
64
|
postId: string;
|
|
65
|
+
parentId?: string | null | undefined;
|
|
21
66
|
}, {
|
|
22
67
|
content: string;
|
|
23
68
|
postId: string;
|
|
69
|
+
parentId?: string | null | undefined;
|
|
24
70
|
}>;
|
|
71
|
+
//# sourceMappingURL=validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/lib/validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,gBAAgB,4DAK3B,CAAC;AACH,eAAO,MAAM,mBAAmB,qDAK9B,CAAC;AAGH,eAAO,MAAM,cAAc;;;;;;;;;;;;EAOzB,CAAC;AAGH,eAAO,MAAM,SAAS;;;;;;;;;EAMpB,CAAC;AAGH,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAiBrB,CAAC;AAGH,eAAO,MAAM,aAAa;;;;;;;;;;;;EAIxB,CAAC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
// --- Enums Matching Database ---
|
|
3
|
+
export const postStatusSchema = z.enum([
|
|
4
|
+
"draft",
|
|
5
|
+
"published",
|
|
6
|
+
"archived",
|
|
7
|
+
"scheduled",
|
|
8
|
+
]);
|
|
9
|
+
export const commentStatusSchema = z.enum([
|
|
10
|
+
"pending",
|
|
11
|
+
"approved",
|
|
12
|
+
"spam",
|
|
13
|
+
"trash",
|
|
14
|
+
]);
|
|
15
|
+
// --- Category Validation ---
|
|
16
|
+
export const categorySchema = z.object({
|
|
17
|
+
name: z.string().min(2, "Name must be at least 2 characters"),
|
|
18
|
+
slug: z
|
|
19
|
+
.string()
|
|
20
|
+
.min(2, "Slug must be at least 2 characters")
|
|
21
|
+
.regex(/^[a-z0-9-]+$/, "Invalid slug format"),
|
|
22
|
+
description: z.string().optional(),
|
|
23
|
+
});
|
|
24
|
+
// --- Tag Validation ---
|
|
25
|
+
export const tagSchema = z.object({
|
|
26
|
+
name: z.string().min(1, "Tag name is required"),
|
|
27
|
+
slug: z
|
|
28
|
+
.string()
|
|
29
|
+
.min(1, "Slug is required")
|
|
30
|
+
.regex(/^[a-z0-9-]+$/, "Invalid slug format"),
|
|
31
|
+
});
|
|
32
|
+
// --- Post Validation ---
|
|
33
|
+
export const postSchema = z.object({
|
|
34
|
+
title: z.string().min(3, "Title must be at least 3 characters"),
|
|
35
|
+
slug: z
|
|
36
|
+
.string()
|
|
37
|
+
.min(3, "Slug is required")
|
|
38
|
+
.regex(/^[a-z0-9-]+$/, "Invalid slug format"),
|
|
39
|
+
excerpt: z.string().max(300, "Excerpt is too long").optional(),
|
|
40
|
+
content: z.string().min(10, "Content must be at least 10 characters"),
|
|
41
|
+
coverImage: z
|
|
42
|
+
.string()
|
|
43
|
+
.url("Invalid cover image URL")
|
|
44
|
+
.or(z.literal(""))
|
|
45
|
+
.optional(),
|
|
46
|
+
status: postStatusSchema.default("draft"),
|
|
47
|
+
categoryId: z.string().optional().nullable(),
|
|
48
|
+
tags: z.array(z.string()).optional(), // Array of tag IDs
|
|
49
|
+
publishedAt: z.date().optional().nullable(),
|
|
50
|
+
});
|
|
51
|
+
// --- Comment Validation ---
|
|
52
|
+
export const commentSchema = z.object({
|
|
53
|
+
postId: z.string(),
|
|
54
|
+
parentId: z.string().optional().nullable(),
|
|
55
|
+
content: z.string().min(2, "Comment must be at least 2 characters"),
|
|
56
|
+
});
|
|
57
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/lib/validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,kCAAkC;AAClC,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,IAAI,CAAC;IACrC,OAAO;IACP,WAAW;IACX,UAAU;IACV,WAAW;CACZ,CAAC,CAAC;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,IAAI,CAAC;IACxC,SAAS;IACT,UAAU;IACV,MAAM;IACN,OAAO;CACR,CAAC,CAAC;AAEH,8BAA8B;AAC9B,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC;IACrC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,oCAAoC,CAAC;IAC7D,IAAI,EAAE,CAAC;SACJ,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,EAAE,oCAAoC,CAAC;SAC5C,KAAK,CAAC,cAAc,EAAE,qBAAqB,CAAC;IAC/C,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACnC,CAAC,CAAC;AAEH,yBAAyB;AACzB,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,CAAC,MAAM,CAAC;IAChC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,sBAAsB,CAAC;IAC/C,IAAI,EAAE,CAAC;SACJ,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,EAAE,kBAAkB,CAAC;SAC1B,KAAK,CAAC,cAAc,EAAE,qBAAqB,CAAC;CAChD,CAAC,CAAC;AAEH,0BAA0B;AAC1B,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC;IACjC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,qCAAqC,CAAC;IAC/D,IAAI,EAAE,CAAC;SACJ,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,EAAE,kBAAkB,CAAC;SAC1B,KAAK,CAAC,cAAc,EAAE,qBAAqB,CAAC;IAC/C,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE,qBAAqB,CAAC,CAAC,QAAQ,EAAE;IAC9D,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,wCAAwC,CAAC;IACrE,UAAU,EAAE,CAAC;SACV,MAAM,EAAE;SACR,GAAG,CAAC,yBAAyB,CAAC;SAC9B,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;SACjB,QAAQ,EAAE;IACb,MAAM,EAAE,gBAAgB,CAAC,OAAO,CAAC,OAAO,CAAC;IACzC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAC5C,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,EAAE,mBAAmB;IACzD,WAAW,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;CAC5C,CAAC,CAAC;AAEH,6BAA6B;AAC7B,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC;IACpC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;IAClB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAC1C,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,uCAAuC,CAAC;CACpE,CAAC,CAAC"}
|
package/dist/navigation.d.ts
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"navigation.d.ts","sourceRoot":"","sources":["../src/navigation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,eAAO,MAAM,UAAU,EAAE,gBAwCxB,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { i18n } from "@vilio/intl";
|
|
2
|
+
export const navigation = {
|
|
3
|
+
public: [
|
|
4
|
+
{
|
|
5
|
+
title: i18n("Blog"),
|
|
6
|
+
url: "/blog",
|
|
7
|
+
icon: "solar:pen-2-broken",
|
|
8
|
+
},
|
|
9
|
+
],
|
|
10
|
+
admin: {
|
|
11
|
+
[i18n("CMS")]: [
|
|
12
|
+
{
|
|
13
|
+
title: i18n("Blog Posts"),
|
|
14
|
+
url: "/blog",
|
|
15
|
+
icon: "solar:posts-carousel-vertical-broken",
|
|
16
|
+
roles: ["admin"],
|
|
17
|
+
permissions: ["post:create", "post:update", "post:delete"],
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
title: i18n("Categories"),
|
|
21
|
+
url: "/blog/categories",
|
|
22
|
+
icon: "solar:folder-open-broken",
|
|
23
|
+
roles: ["admin"],
|
|
24
|
+
permissions: ["post:update"],
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
title: i18n("Tags"),
|
|
28
|
+
url: "/blog/tags",
|
|
29
|
+
icon: "solar:tag-broken",
|
|
30
|
+
roles: ["admin"],
|
|
31
|
+
permissions: ["post:update"],
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
title: i18n("Comments"),
|
|
35
|
+
url: "/blog/comments",
|
|
36
|
+
icon: "solar:chat-line-broken",
|
|
37
|
+
roles: ["admin"],
|
|
38
|
+
permissions: ["comment:update", "comment:delete"],
|
|
39
|
+
},
|
|
40
|
+
],
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
//# sourceMappingURL=navigation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"navigation.js","sourceRoot":"","sources":["../src/navigation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAGnC,MAAM,CAAC,MAAM,UAAU,GAAqB;IAC1C,MAAM,EAAE;QACN;YACE,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC;YACnB,GAAG,EAAE,OAAO;YACZ,IAAI,EAAE,oBAAoB;SAC3B;KACF;IACD,KAAK,EAAE;QACL,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE;YACb;gBACE,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC;gBACzB,GAAG,EAAE,OAAO;gBACZ,IAAI,EAAE,sCAAsC;gBAC5C,KAAK,EAAE,CAAC,OAAO,CAAC;gBAChB,WAAW,EAAE,CAAC,aAAa,EAAE,aAAa,EAAE,aAAa,CAAC;aAC3D;YACD;gBACE,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC;gBACzB,GAAG,EAAE,kBAAkB;gBACvB,IAAI,EAAE,0BAA0B;gBAChC,KAAK,EAAE,CAAC,OAAO,CAAC;gBAChB,WAAW,EAAE,CAAC,aAAa,CAAC;aAC7B;YACD;gBACE,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC;gBACnB,GAAG,EAAE,YAAY;gBACjB,IAAI,EAAE,kBAAkB;gBACxB,KAAK,EAAE,CAAC,OAAO,CAAC;gBAChB,WAAW,EAAE,CAAC,aAAa,CAAC;aAC7B;YACD;gBACE,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC;gBACvB,GAAG,EAAE,gBAAgB;gBACrB,IAAI,EAAE,wBAAwB;gBAC9B,KAAK,EAAE,CAAC,OAAO,CAAC;gBAChB,WAAW,EAAE,CAAC,gBAAgB,EAAE,gBAAgB,CAAC;aAClD;SACF;KACF;CACF,CAAC"}
|
package/dist/routes.d.ts
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../src/routes.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,sBAAsB,EACtB,qBAAqB,EACtB,MAAM,gBAAgB,CAAC;AAsBxB,eAAO,MAAM,YAAY,EAAE,qBAAqB,EAoE/C,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,sBAAsB,EA2DjD,CAAC"}
|
package/dist/routes.js
ADDED
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { getCurrentSession } from "@vilio/core/server";
|
|
3
|
+
import { getAllComments, getCategories, getComments, getPostById, getPostBySlug, getPosts, getTags, } from "./actions/index";
|
|
4
|
+
import { BlogAdminPage, BlogCategoriesPage, BlogCommentsPage, BlogListPage, BlogTagsPage, CreatePostForm, EditPostForm, PostDetailPage, } from "./ui/views";
|
|
5
|
+
export const publicRoutes = [
|
|
6
|
+
{
|
|
7
|
+
id: "blog:home",
|
|
8
|
+
path: "/",
|
|
9
|
+
generateMetadata: async () => ({
|
|
10
|
+
title: "Blog",
|
|
11
|
+
description: "Read our latest stories and updates.",
|
|
12
|
+
}),
|
|
13
|
+
component: async () => {
|
|
14
|
+
const posts = await getPosts({ status: "published" });
|
|
15
|
+
return _jsx(BlogListPage, { posts: posts });
|
|
16
|
+
},
|
|
17
|
+
auth: false,
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
id: "blog:list",
|
|
21
|
+
path: "/blog",
|
|
22
|
+
generateMetadata: async () => ({
|
|
23
|
+
title: "Blog",
|
|
24
|
+
description: "Read our latest stories and updates.",
|
|
25
|
+
}),
|
|
26
|
+
component: async () => {
|
|
27
|
+
const posts = await getPosts({ status: "published" });
|
|
28
|
+
return _jsx(BlogListPage, { posts: posts });
|
|
29
|
+
},
|
|
30
|
+
auth: false,
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
id: "blog:detail",
|
|
34
|
+
path: "/blog/:slug",
|
|
35
|
+
generateMetadata: async ({ params }) => {
|
|
36
|
+
const { slug } = await params;
|
|
37
|
+
const post = await getPostBySlug(slug);
|
|
38
|
+
if (!post)
|
|
39
|
+
return { title: "Post Not Found" };
|
|
40
|
+
return {
|
|
41
|
+
title: post.title,
|
|
42
|
+
description: post.excerpt || post.content.substring(0, 160),
|
|
43
|
+
openGraph: {
|
|
44
|
+
images: post.coverImage ? [post.coverImage] : [],
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
},
|
|
48
|
+
component: async ({ params }) => {
|
|
49
|
+
const { slug } = await params;
|
|
50
|
+
const post = await getPostBySlug(slug);
|
|
51
|
+
if (!post || post.status !== "published") {
|
|
52
|
+
return (_jsx("div", { className: "p-20 text-center uppercase font-black opacity-30 italic", children: "Post not found or not published yet." }));
|
|
53
|
+
}
|
|
54
|
+
const comments = await getComments(post.id);
|
|
55
|
+
const session = await getCurrentSession();
|
|
56
|
+
return (_jsx(PostDetailPage, { post: post, comments: comments, currentUser: session?.user }));
|
|
57
|
+
},
|
|
58
|
+
auth: false,
|
|
59
|
+
},
|
|
60
|
+
];
|
|
61
|
+
export const privateRoutes = [
|
|
62
|
+
{
|
|
63
|
+
path: "/blog",
|
|
64
|
+
component: async () => {
|
|
65
|
+
const posts = await getPosts();
|
|
66
|
+
return _jsx(BlogAdminPage, { posts: posts });
|
|
67
|
+
},
|
|
68
|
+
auth: true,
|
|
69
|
+
roles: ["admin"],
|
|
70
|
+
permissions: ["post:create", "post:update", "post:delete"],
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
path: "/blog/new",
|
|
74
|
+
component: CreatePostForm,
|
|
75
|
+
auth: true,
|
|
76
|
+
roles: ["admin"],
|
|
77
|
+
permissions: ["post:create"],
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
path: "/blog/edit/:id",
|
|
81
|
+
component: async ({ params }) => {
|
|
82
|
+
const { id } = await params;
|
|
83
|
+
const post = await getPostById(id);
|
|
84
|
+
return _jsx(EditPostForm, { post: post });
|
|
85
|
+
},
|
|
86
|
+
auth: true,
|
|
87
|
+
roles: ["admin"],
|
|
88
|
+
permissions: ["post:update"],
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
path: "/blog/categories",
|
|
92
|
+
component: async () => {
|
|
93
|
+
const categories = await getCategories();
|
|
94
|
+
return _jsx(BlogCategoriesPage, { categories: categories });
|
|
95
|
+
},
|
|
96
|
+
auth: true,
|
|
97
|
+
roles: ["admin"],
|
|
98
|
+
permissions: ["post:update"],
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
path: "/blog/tags",
|
|
102
|
+
component: async () => {
|
|
103
|
+
const tags = await getTags();
|
|
104
|
+
return _jsx(BlogTagsPage, { tags: tags });
|
|
105
|
+
},
|
|
106
|
+
auth: true,
|
|
107
|
+
roles: ["admin"],
|
|
108
|
+
permissions: ["post:update"],
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
path: "/blog/comments",
|
|
112
|
+
component: async () => {
|
|
113
|
+
const comments = await getAllComments();
|
|
114
|
+
return _jsx(BlogCommentsPage, { comments: comments });
|
|
115
|
+
},
|
|
116
|
+
auth: true,
|
|
117
|
+
roles: ["admin"],
|
|
118
|
+
permissions: ["comment:update", "comment:delete"],
|
|
119
|
+
},
|
|
120
|
+
];
|
|
121
|
+
//# sourceMappingURL=routes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routes.js","sourceRoot":"","sources":["../src/routes.tsx"],"names":[],"mappings":"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"}
|