@vilio/blog-module 0.0.3 → 0.0.4

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.
Files changed (83) hide show
  1. package/dist/actions/index.d.ts +177 -7
  2. package/dist/actions/index.d.ts.map +1 -0
  3. package/dist/actions/index.js +341 -0
  4. package/dist/actions/index.js.map +1 -0
  5. package/dist/components/BlogStatsWidget.d.ts +2 -2
  6. package/dist/components/BlogStatsWidget.d.ts.map +1 -0
  7. package/dist/components/BlogStatsWidget.js +18 -0
  8. package/dist/components/BlogStatsWidget.js.map +1 -0
  9. package/dist/components/RecentCommentsWidget.d.ts +2 -2
  10. package/dist/components/RecentCommentsWidget.d.ts.map +1 -0
  11. package/dist/components/RecentCommentsWidget.js +25 -0
  12. package/dist/components/RecentCommentsWidget.js.map +1 -0
  13. package/dist/components/RecentPostsWidget.d.ts +2 -2
  14. package/dist/components/RecentPostsWidget.d.ts.map +1 -0
  15. package/dist/components/RecentPostsWidget.js +25 -0
  16. package/dist/components/RecentPostsWidget.js.map +1 -0
  17. package/dist/index.d.ts +2 -0
  18. package/dist/index.d.ts.map +1 -0
  19. package/dist/index.js +108 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/lib/validation.d.ts +51 -4
  22. package/dist/lib/validation.d.ts.map +1 -0
  23. package/dist/lib/validation.js +57 -0
  24. package/dist/lib/validation.js.map +1 -0
  25. package/dist/navigation.d.ts +1 -0
  26. package/dist/navigation.d.ts.map +1 -0
  27. package/dist/navigation.js +43 -0
  28. package/dist/navigation.js.map +1 -0
  29. package/dist/routes.d.ts +1 -0
  30. package/dist/routes.d.ts.map +1 -0
  31. package/dist/routes.js +121 -0
  32. package/dist/routes.js.map +1 -0
  33. package/dist/schema.d.ts +491 -128
  34. package/dist/schema.d.ts.map +1 -0
  35. package/dist/schema.js +168 -0
  36. package/dist/schema.js.map +1 -0
  37. package/dist/ui/views.d.ts +15 -6
  38. package/dist/ui/views.d.ts.map +1 -0
  39. package/dist/ui/views.js +204 -0
  40. package/dist/ui/views.js.map +1 -0
  41. package/locales/en/global.json +28 -1
  42. package/locales/pl/global.json +36 -9
  43. package/package.json +16 -26
  44. package/dist/actions/index.cjs +0 -158
  45. package/dist/actions/index.mjs +0 -121
  46. package/dist/components/BlogStatsWidget.cjs +0 -45
  47. package/dist/components/BlogStatsWidget.mjs +0 -13
  48. package/dist/components/RecentCommentsWidget.cjs +0 -47
  49. package/dist/components/RecentCommentsWidget.mjs +0 -28
  50. package/dist/components/RecentPostsWidget.cjs +0 -47
  51. package/dist/components/RecentPostsWidget.mjs +0 -28
  52. package/dist/components/ui/button.cjs +0 -54
  53. package/dist/components/ui/button.d.ts +0 -11
  54. package/dist/components/ui/button.mjs +0 -47
  55. package/dist/components/ui/card.cjs +0 -47
  56. package/dist/components/ui/card.d.ts +0 -6
  57. package/dist/components/ui/card.mjs +0 -36
  58. package/dist/components/ui/input.cjs +0 -24
  59. package/dist/components/ui/input.d.ts +0 -5
  60. package/dist/components/ui/input.mjs +0 -17
  61. package/dist/components/ui/table.cjs +0 -68
  62. package/dist/components/ui/table.d.ts +0 -8
  63. package/dist/components/ui/table.mjs +0 -65
  64. package/dist/components/ui/textarea.cjs +0 -22
  65. package/dist/components/ui/textarea.d.ts +0 -5
  66. package/dist/components/ui/textarea.mjs +0 -16
  67. package/dist/index.cjs +0 -102
  68. package/dist/index.mjs +0 -97
  69. package/dist/intl.d.ts +0 -7
  70. package/dist/lib/utils.cjs +0 -11
  71. package/dist/lib/utils.d.ts +0 -2
  72. package/dist/lib/utils.mjs +0 -5
  73. package/dist/lib/validation.cjs +0 -16
  74. package/dist/lib/validation.mjs +0 -10
  75. package/dist/navigation.cjs +0 -23
  76. package/dist/navigation.mjs +0 -21
  77. package/dist/routes.cjs +0 -74
  78. package/dist/routes.mjs +0 -68
  79. package/dist/schema.cjs +0 -62
  80. package/dist/schema.mjs +0 -53
  81. package/dist/styles/globals.css +0 -1
  82. package/dist/ui/views.cjs +0 -448
  83. 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
@@ -1,3 +1,5 @@
1
1
  import type { IModule } from "@vilio/modules";
2
2
  declare const blogModule: IModule;
3
+ export * from "./schema";
3
4
  export default blogModule;
5
+ //# sourceMappingURL=index.d.ts.map
@@ -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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"}
@@ -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
- slug: string;
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
- slug: string;
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"}
@@ -1,2 +1,3 @@
1
1
  import type { ModuleNavigation } from "@vilio/modules";
2
2
  export declare const navigation: ModuleNavigation;
3
+ //# sourceMappingURL=navigation.d.ts.map
@@ -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
@@ -1,3 +1,4 @@
1
1
  import type { PrivateRouteDefinition, PublicRouteDefinition } from "@vilio/modules";
2
2
  export declare const publicRoutes: PublicRouteDefinition[];
3
3
  export declare const privateRoutes: PrivateRouteDefinition[];
4
+ //# sourceMappingURL=routes.d.ts.map
@@ -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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"}