@vitnode/blog 1.2.0-canary.77 → 2.0.0-canary.1

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 (166) hide show
  1. package/dist/src/admin/content.d.ts +5 -0
  2. package/dist/src/admin/content.d.ts.map +1 -0
  3. package/dist/src/admin/content.js +1 -0
  4. package/dist/src/admin/nav.d.ts +41 -0
  5. package/dist/src/admin/nav.d.ts.map +1 -0
  6. package/dist/src/admin/nav.js +1 -0
  7. package/dist/src/api/lib/events.d.ts +11 -3
  8. package/dist/src/api/lib/events.d.ts.map +1 -1
  9. package/dist/src/api/lib/events.js +1 -1
  10. package/dist/src/api/modules/admin/admin.module.d.ts +1 -218
  11. package/dist/src/api/modules/admin/admin.module.d.ts.map +1 -1
  12. package/dist/src/api/modules/admin/admin.module.js +1 -1
  13. package/dist/src/config.api.d.ts.map +1 -1
  14. package/dist/src/config.api.js +1 -1
  15. package/dist/src/config.d.ts.map +1 -1
  16. package/dist/src/config.js +1 -1
  17. package/dist/src/content/category.d.ts +5 -0
  18. package/dist/src/content/category.d.ts.map +1 -0
  19. package/dist/src/content/category.js +1 -0
  20. package/dist/src/content/post.d.ts +10 -0
  21. package/dist/src/content/post.d.ts.map +1 -0
  22. package/dist/src/content/post.js +1 -0
  23. package/dist/src/database/categories.d.ts +10 -77
  24. package/dist/src/database/categories.d.ts.map +1 -1
  25. package/dist/src/database/categories.js +1 -1
  26. package/dist/src/database/posts.d.ts +22 -92
  27. package/dist/src/database/posts.d.ts.map +1 -1
  28. package/dist/src/database/posts.js +1 -1
  29. package/dist/src/locales/en.json +50 -73
  30. package/dist/src/locales/index.d.ts.map +1 -1
  31. package/dist/src/locales/index.js +1 -1
  32. package/dist/src/locales/pl.json +69 -0
  33. package/dist/src/views/admin/article/editor-field.d.ts +4 -0
  34. package/dist/src/views/admin/article/editor-field.d.ts.map +1 -0
  35. package/dist/src/views/admin/article/editor-field.js +1 -0
  36. package/dist/src/views/admin/article/form-layout.d.ts +3 -0
  37. package/dist/src/views/admin/article/form-layout.d.ts.map +1 -0
  38. package/dist/src/views/admin/article/form-layout.js +1 -0
  39. package/dist/src/views/admin/category/color-cell.d.ts +4 -0
  40. package/dist/src/views/admin/category/color-cell.d.ts.map +1 -0
  41. package/dist/src/views/admin/category/color-cell.js +1 -0
  42. package/dist/src/views/admin/category/color-field.d.ts +3 -0
  43. package/dist/src/views/admin/category/color-field.d.ts.map +1 -0
  44. package/dist/src/views/admin/category/color-field.js +1 -0
  45. package/dist/vitest.config.d.ts +3 -0
  46. package/dist/vitest.config.d.ts.map +1 -0
  47. package/package.json +16 -10
  48. package/src/locales/en.json +50 -73
  49. package/src/locales/index.ts +1 -0
  50. package/src/locales/pl.json +69 -0
  51. package/tsconfig.build.json +6 -1
  52. package/dist/src/api/lib/categories-language.d.ts +0 -10
  53. package/dist/src/api/lib/categories-language.d.ts.map +0 -1
  54. package/dist/src/api/lib/categories-language.js +0 -1
  55. package/dist/src/api/lib/posts-language.d.ts +0 -17
  56. package/dist/src/api/lib/posts-language.d.ts.map +0 -1
  57. package/dist/src/api/lib/posts-language.js +0 -1
  58. package/dist/src/api/lib/search.d.ts +0 -13
  59. package/dist/src/api/lib/search.d.ts.map +0 -1
  60. package/dist/src/api/lib/search.js +0 -1
  61. package/dist/src/api/modules/admin/categories/categories.admin.module.d.ts +0 -100
  62. package/dist/src/api/modules/admin/categories/categories.admin.module.d.ts.map +0 -1
  63. package/dist/src/api/modules/admin/categories/categories.admin.module.js +0 -1
  64. package/dist/src/api/modules/admin/categories/routes/create.route.d.ts +0 -47
  65. package/dist/src/api/modules/admin/categories/routes/create.route.d.ts.map +0 -1
  66. package/dist/src/api/modules/admin/categories/routes/create.route.js +0 -1
  67. package/dist/src/api/modules/admin/categories/routes/delete.route.d.ts +0 -21
  68. package/dist/src/api/modules/admin/categories/routes/delete.route.d.ts.map +0 -1
  69. package/dist/src/api/modules/admin/categories/routes/delete.route.js +0 -1
  70. package/dist/src/api/modules/admin/categories/routes/edit.route.d.ts +0 -46
  71. package/dist/src/api/modules/admin/categories/routes/edit.route.d.ts.map +0 -1
  72. package/dist/src/api/modules/admin/categories/routes/edit.route.js +0 -1
  73. package/dist/src/api/modules/admin/posts/posts.admin.module.d.ts +0 -121
  74. package/dist/src/api/modules/admin/posts/posts.admin.module.d.ts.map +0 -1
  75. package/dist/src/api/modules/admin/posts/posts.admin.module.js +0 -1
  76. package/dist/src/api/modules/admin/posts/routes/create.route.d.ts +0 -67
  77. package/dist/src/api/modules/admin/posts/routes/create.route.d.ts.map +0 -1
  78. package/dist/src/api/modules/admin/posts/routes/create.route.js +0 -1
  79. package/dist/src/api/modules/admin/posts/routes/delete.route.d.ts +0 -21
  80. package/dist/src/api/modules/admin/posts/routes/delete.route.d.ts.map +0 -1
  81. package/dist/src/api/modules/admin/posts/routes/delete.route.js +0 -1
  82. package/dist/src/api/modules/admin/posts/routes/edit.route.d.ts +0 -55
  83. package/dist/src/api/modules/admin/posts/routes/edit.route.d.ts.map +0 -1
  84. package/dist/src/api/modules/admin/posts/routes/edit.route.js +0 -1
  85. package/dist/src/api/modules/categories/categories.module.d.ts +0 -75
  86. package/dist/src/api/modules/categories/categories.module.d.ts.map +0 -1
  87. package/dist/src/api/modules/categories/categories.module.js +0 -1
  88. package/dist/src/api/modules/categories/routes/get.route.d.ts +0 -62
  89. package/dist/src/api/modules/categories/routes/get.route.d.ts.map +0 -1
  90. package/dist/src/api/modules/categories/routes/get.route.js +0 -1
  91. package/dist/src/api/modules/categories/test.route.d.ts +0 -27
  92. package/dist/src/api/modules/categories/test.route.d.ts.map +0 -1
  93. package/dist/src/api/modules/categories/test.route.js +0 -1
  94. package/dist/src/api/modules/posts/posts.module.d.ts +0 -73
  95. package/dist/src/api/modules/posts/posts.module.d.ts.map +0 -1
  96. package/dist/src/api/modules/posts/posts.module.js +0 -1
  97. package/dist/src/api/modules/posts/routes/get.route.d.ts +0 -105
  98. package/dist/src/api/modules/posts/routes/get.route.d.ts.map +0 -1
  99. package/dist/src/api/modules/posts/routes/get.route.js +0 -1
  100. package/dist/src/database/index.d.ts +0 -4
  101. package/dist/src/database/index.d.ts.map +0 -1
  102. package/dist/src/database/index.js +0 -1
  103. package/dist/src/database/relations.d.ts +0 -7
  104. package/dist/src/database/relations.d.ts.map +0 -1
  105. package/dist/src/database/relations.js +0 -1
  106. package/dist/src/routes/admin/blog/categories/page.d.ts +0 -9
  107. package/dist/src/routes/admin/blog/categories/page.d.ts.map +0 -1
  108. package/dist/src/routes/admin/blog/categories/page.js +0 -1
  109. package/dist/src/routes/admin/blog/posts/page.d.ts +0 -9
  110. package/dist/src/routes/admin/blog/posts/page.d.ts.map +0 -1
  111. package/dist/src/routes/admin/blog/posts/page.js +0 -1
  112. package/dist/src/routes/breadcrumb/admin/blog/categories/page.d.ts +0 -2
  113. package/dist/src/routes/breadcrumb/admin/blog/categories/page.d.ts.map +0 -1
  114. package/dist/src/routes/breadcrumb/admin/blog/categories/page.js +0 -1
  115. package/dist/src/routes/breadcrumb/admin/blog/posts/page.d.ts +0 -2
  116. package/dist/src/routes/breadcrumb/admin/blog/posts/page.d.ts.map +0 -1
  117. package/dist/src/routes/breadcrumb/admin/blog/posts/page.js +0 -1
  118. package/dist/src/views/admin/categories/actions/actions.d.ts +0 -3
  119. package/dist/src/views/admin/categories/actions/actions.d.ts.map +0 -1
  120. package/dist/src/views/admin/categories/actions/actions.js +0 -1
  121. package/dist/src/views/admin/categories/actions/create-edit/create-edit.d.ts +0 -8
  122. package/dist/src/views/admin/categories/actions/create-edit/create-edit.d.ts.map +0 -1
  123. package/dist/src/views/admin/categories/actions/create-edit/create-edit.js +0 -1
  124. package/dist/src/views/admin/categories/actions/create-edit/mutation-api.server.d.ts +0 -11
  125. package/dist/src/views/admin/categories/actions/create-edit/mutation-api.server.d.ts.map +0 -1
  126. package/dist/src/views/admin/categories/actions/create-edit/mutation-api.server.js +0 -1
  127. package/dist/src/views/admin/categories/table/actions/delete/delete-action.d.ts +0 -5
  128. package/dist/src/views/admin/categories/table/actions/delete/delete-action.d.ts.map +0 -1
  129. package/dist/src/views/admin/categories/table/actions/delete/delete-action.js +0 -1
  130. package/dist/src/views/admin/categories/table/actions/delete/mutation-api.server.d.ts +0 -4
  131. package/dist/src/views/admin/categories/table/actions/delete/mutation-api.server.d.ts.map +0 -1
  132. package/dist/src/views/admin/categories/table/actions/delete/mutation-api.server.js +0 -1
  133. package/dist/src/views/admin/categories/table/actions/edit-action.d.ts +0 -9
  134. package/dist/src/views/admin/categories/table/actions/edit-action.d.ts.map +0 -1
  135. package/dist/src/views/admin/categories/table/actions/edit-action.js +0 -1
  136. package/dist/src/views/admin/categories/table/categories-admin-view.d.ts +0 -4
  137. package/dist/src/views/admin/categories/table/categories-admin-view.d.ts.map +0 -1
  138. package/dist/src/views/admin/categories/table/categories-admin-view.js +0 -1
  139. package/dist/src/views/admin/posts/actions/actions.d.ts +0 -3
  140. package/dist/src/views/admin/posts/actions/actions.d.ts.map +0 -1
  141. package/dist/src/views/admin/posts/actions/actions.js +0 -1
  142. package/dist/src/views/admin/posts/actions/create-edit/create-edit.d.ts +0 -9
  143. package/dist/src/views/admin/posts/actions/create-edit/create-edit.d.ts.map +0 -1
  144. package/dist/src/views/admin/posts/actions/create-edit/create-edit.js +0 -1
  145. package/dist/src/views/admin/posts/actions/create-edit/multi-lang-fields.d.ts +0 -10
  146. package/dist/src/views/admin/posts/actions/create-edit/multi-lang-fields.d.ts.map +0 -1
  147. package/dist/src/views/admin/posts/actions/create-edit/multi-lang-fields.js +0 -1
  148. package/dist/src/views/admin/posts/actions/create-edit/mutation-api.server.d.ts +0 -11
  149. package/dist/src/views/admin/posts/actions/create-edit/mutation-api.server.d.ts.map +0 -1
  150. package/dist/src/views/admin/posts/actions/create-edit/mutation-api.server.js +0 -1
  151. package/dist/src/views/admin/posts/table/actions/delete/delete-action.d.ts +0 -5
  152. package/dist/src/views/admin/posts/table/actions/delete/delete-action.d.ts.map +0 -1
  153. package/dist/src/views/admin/posts/table/actions/delete/delete-action.js +0 -1
  154. package/dist/src/views/admin/posts/table/actions/delete/mutation-api.server.d.ts +0 -4
  155. package/dist/src/views/admin/posts/table/actions/delete/mutation-api.server.d.ts.map +0 -1
  156. package/dist/src/views/admin/posts/table/actions/delete/mutation-api.server.js +0 -1
  157. package/dist/src/views/admin/posts/table/actions/edit-action.d.ts +0 -9
  158. package/dist/src/views/admin/posts/table/actions/edit-action.d.ts.map +0 -1
  159. package/dist/src/views/admin/posts/table/actions/edit-action.js +0 -1
  160. package/dist/src/views/admin/posts/table/posts-admin-view.d.ts +0 -4
  161. package/dist/src/views/admin/posts/table/posts-admin-view.d.ts.map +0 -1
  162. package/dist/src/views/admin/posts/table/posts-admin-view.js +0 -1
  163. package/src/routes/admin/blog/categories/page.tsx +0 -64
  164. package/src/routes/admin/blog/posts/page.tsx +0 -64
  165. package/src/routes/breadcrumb/admin/blog/categories/page.tsx +0 -5
  166. package/src/routes/breadcrumb/admin/blog/posts/page.tsx +0 -5
@@ -1,93 +1,23 @@
1
- export declare const blog_posts: Omit<import("drizzle-orm/pg-core").PgTableWithColumns<{
2
- name: "blog_posts";
3
- schema: undefined;
4
- columns: {
5
- id: import("drizzle-orm/pg-core").PgColumn<{
6
- name: "id";
7
- tableName: "blog_posts";
8
- dataType: "number";
9
- columnType: "PgSerial";
10
- data: number;
11
- driverParam: number;
12
- notNull: true;
13
- hasDefault: true;
14
- isPrimaryKey: true;
15
- isAutoincrement: false;
16
- hasRuntimeDefault: false;
17
- enumValues: undefined;
18
- baseColumn: never;
19
- identity: undefined;
20
- generated: undefined;
21
- }, {}, {}>;
22
- categoryId: import("drizzle-orm/pg-core").PgColumn<{
23
- name: "categoryId";
24
- tableName: "blog_posts";
25
- dataType: "number";
26
- columnType: "PgInteger";
27
- data: number;
28
- driverParam: string | number;
29
- notNull: true;
30
- hasDefault: false;
31
- isPrimaryKey: false;
32
- isAutoincrement: false;
33
- hasRuntimeDefault: false;
34
- enumValues: undefined;
35
- baseColumn: never;
36
- identity: undefined;
37
- generated: undefined;
38
- }, {}, {}>;
39
- authorId: import("drizzle-orm/pg-core").PgColumn<{
40
- name: "authorId";
41
- tableName: "blog_posts";
42
- dataType: "number";
43
- columnType: "PgInteger";
44
- data: number;
45
- driverParam: string | number;
46
- notNull: false;
47
- hasDefault: false;
48
- isPrimaryKey: false;
49
- isAutoincrement: false;
50
- hasRuntimeDefault: false;
51
- enumValues: undefined;
52
- baseColumn: never;
53
- identity: undefined;
54
- generated: undefined;
55
- }, {}, {}>;
56
- createdAt: import("drizzle-orm/pg-core").PgColumn<{
57
- name: "createdAt";
58
- tableName: "blog_posts";
59
- dataType: "date";
60
- columnType: "PgTimestamp";
61
- data: Date;
62
- driverParam: string;
63
- notNull: true;
64
- hasDefault: true;
65
- isPrimaryKey: false;
66
- isAutoincrement: false;
67
- hasRuntimeDefault: false;
68
- enumValues: undefined;
69
- baseColumn: never;
70
- identity: undefined;
71
- generated: undefined;
72
- }, {}, {}>;
73
- updatedAt: import("drizzle-orm/pg-core").PgColumn<{
74
- name: "updatedAt";
75
- tableName: "blog_posts";
76
- dataType: "date";
77
- columnType: "PgTimestamp";
78
- data: Date;
79
- driverParam: string;
80
- notNull: true;
81
- hasDefault: true;
82
- isPrimaryKey: false;
83
- isAutoincrement: false;
84
- hasRuntimeDefault: false;
85
- enumValues: undefined;
86
- baseColumn: never;
87
- identity: undefined;
88
- generated: undefined;
89
- }, {}, {}>;
90
- };
91
- dialect: "pg";
92
- }>, "enableRLS">;
1
+ export declare const postContent: import("@vitnode/core/content/server").ContentModel<import("@vitnode/core/content").ContentTypeDefinition<"blog.post", {
2
+ categoryId: import("@vitnode/core/content").ContentRelationField<false, false, true, false, false>;
3
+ authorId: import("@vitnode/core/content").ContentUserField<false, false, true, true>;
4
+ title: import("@vitnode/core/content").ContentTextField<true, false, undefined, true>;
5
+ friendlyUrl: import("@vitnode/core/content").ContentSlugField<"title", true>;
6
+ content: import("@vitnode/core/content").ContentTextareaField<true, false, undefined, true>;
7
+ coverImage: import("@vitnode/core/content/types").ContentFileField<false, true, false, false>;
8
+ coverImageAlt: import("@vitnode/core/content").ContentTextField<false, true, undefined, true>;
9
+ }, true, "id" | "publishedAt" | "categoryId" | "title" | "friendlyUrl" | "content" | "coverImage" | "coverImageAlt", true, true, true, true, true, true, true>>;
10
+ export declare const blog_posts: import("@vitnode/core/content/server").ContentTable<string, import("@vitnode/core/content/server/types").ContentStorageFields<{
11
+ categoryId: import("@vitnode/core/content").ContentRelationField<false, false, true, false, false>;
12
+ authorId: import("@vitnode/core/content").ContentUserField<false, false, true, true>;
13
+ coverImage: import("@vitnode/core/content/types").ContentFileField<false, true, false, false>;
14
+ }>, true, true>;
15
+ export declare const blog_posts_translations: import("@vitnode/core/content/server").ContentTranslationTable<string, {} & {
16
+ title: import("@vitnode/core/content").ContentTextField<true, false, undefined, true>;
17
+ friendlyUrl: import("@vitnode/core/content").ContentSlugField<"title", true>;
18
+ content: import("@vitnode/core/content").ContentTextareaField<true, false, undefined, true>;
19
+ coverImageAlt: import("@vitnode/core/content").ContentTextField<false, true, undefined, true>;
20
+ }, true> | null;
21
+ export declare const blog_posts_category_id: import("@vitnode/core/content/server/types").ContentJunctionTable;
22
+ export declare const blog_posts_author_id: import("@vitnode/core/content/server/types").ContentJunctionTable;
93
23
  //# sourceMappingURL=posts.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"posts.d.ts","sourceRoot":"","sources":["../../../src/database/posts.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gBAeR,CAAC"}
1
+ {"version":3,"file":"posts.d.ts","sourceRoot":"","sources":["../../../src/database/posts.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,WAAW;;;;;;;;+JAEtB,CAAC;AAEH,eAAO,MAAM,UAAU;;;;eAAoB,CAAC;AAC5C,eAAO,MAAM,uBAAuB;;;;;eAA+B,CAAC;AAEpE,eAAO,MAAM,sBAAsB,mEACc,CAAC;AAClD,eAAO,MAAM,oBAAoB,mEACc,CAAC"}
@@ -1 +1 @@
1
- import{core_users}from"@vitnode/core/database/users";import{pgTable}from"drizzle-orm/pg-core";import{blog_categories}from"./categories.js";export const blog_posts=pgTable("blog_posts",t=>({id:t.serial().primaryKey(),categoryId:t.integer().references(()=>blog_categories.id).notNull(),authorId:t.integer().references(()=>core_users.id,{onDelete:"set null",onUpdate:"cascade"}),createdAt:t.timestamp().notNull().defaultNow(),updatedAt:t.timestamp().notNull().$onUpdate(()=>new Date)})).enableRLS();
1
+ import{createContentModel}from"@vitnode/core/content/server";import{blogPostContentType}from"../content/post.js";import{blog_categories}from"./categories.js";export const postContent=createContentModel(blogPostContentType,{references:{categoryId:()=>blog_categories.id}});export const blog_posts=postContent.table;export const blog_posts_translations=postContent.translationTable;export const blog_posts_category_id=postContent.advancedTables.junctions.categoryId;export const blog_posts_author_id=postContent.advancedTables.junctions.authorId;
@@ -1,89 +1,66 @@
1
1
  {
2
2
  "@vitnode/blog": {
3
3
  "title": "Blog",
4
- "admin": {
5
- "nav": {
6
- "posts": "Posts",
7
- "categories": "Categories"
8
- },
9
- "categories": {
10
- "desc": "Manage categories for blog posts.",
11
- "table": {
4
+ "content": {
5
+ "post": {
6
+ "label": "{count, plural, one {Article} other {Articles}}",
7
+ "title": "Articles",
8
+ "desc": "Write and manage your blog articles.",
9
+ "fields": {
12
10
  "title": "Title",
11
+ "friendlyUrl": "Friendly URL",
12
+ "content": "Content",
13
+ "categoryId": "Categories",
14
+ "authorId": "Authors",
15
+ "coverImage": "Cover image",
16
+ "coverImageAlt": "Cover image alt text",
17
+ "status": "Status",
18
+ "publishedAt": "Published",
19
+ "updatedAt": "Updated"
20
+ }
21
+ },
22
+ "category": {
23
+ "label": "{count, plural, one {Category} other {Categories}}",
24
+ "title": "Categories",
25
+ "desc": "Group articles together.",
26
+ "fields": {
27
+ "name": "Name",
13
28
  "color": "Color",
14
- "updated_at": "Updated At"
15
- },
16
- "delete": {
17
- "title": "Delete Category",
18
- "desc": "Are you sure you want to delete <title></title> category? This action cannot be undone.",
19
- "confirm": "Yes, delete this category",
20
- "success": "Category has been deleted successfully."
29
+ "updatedAt": "Updated"
30
+ }
31
+ }
32
+ },
33
+ "admin": {
34
+ "article": {
35
+ "content": {
36
+ "label": "Content"
21
37
  },
22
- "create": {
23
- "title": "Create Category",
24
- "desc": "A new category for your blog posts.",
25
- "form": {
26
- "title": {
27
- "label": "Title",
28
- "already_exists": "This category title already exists."
29
- },
30
- "color": "Color"
38
+ "form": {
39
+ "publish": "Publish",
40
+ "cover": {
41
+ "title": "Cover image"
31
42
  },
32
- "submit": "Create",
33
- "success": "Category has been created successfully."
34
- },
35
- "edit": {
36
- "title": "Edit Category",
37
- "submit": "Save Changes",
38
- "success": "Category has been updated successfully."
43
+ "settings": {
44
+ "title": "Article settings"
45
+ }
39
46
  }
40
47
  },
41
- "posts": {
42
- "desc": "Write and manage your blog posts.",
43
- "table": {
44
- "title": "Title",
45
- "category": "Category",
46
- "author": "Author",
47
- "updated_at": "Updated At"
48
- },
49
- "create": {
50
- "title": "Create Post",
51
- "desc": "Write a new article for your blog.",
52
- "form": {
53
- "title": {
54
- "label": "Title",
55
- "already_exists": "This post title already exists."
56
- },
57
- "friendly_url": {
58
- "label": "Friendly URL",
59
- "desc": "Used in the post address. Auto-filled from the title.",
60
- "already_exists": "This friendly URL already exists."
61
- },
62
- "content": "Content",
63
- "category": "Category"
64
- },
65
- "submit": "Create Post",
66
- "success": "Post has been created successfully."
67
- },
68
- "edit": {
69
- "title": "Edit Post",
70
- "submit": "Save Changes",
71
- "success": "Post has been updated successfully."
72
- },
73
- "delete": {
74
- "title": "Delete Post",
75
- "desc": "Are you sure you want to delete <title></title> post? This action cannot be undone.",
76
- "confirm": "Yes, delete this post",
77
- "success": "Post has been deleted successfully."
48
+ "category": {
49
+ "color": {
50
+ "label": "Color",
51
+ "desc": "Shown next to the category in lists.",
52
+ "none": "No color"
78
53
  }
79
54
  }
80
55
  }
81
56
  },
82
- "@vitnode/blog:posts": "Posts",
83
- "@vitnode/blog:posts:can_view": "View posts list",
84
- "@vitnode/blog:posts:can_create": "Create posts",
85
- "@vitnode/blog:posts:can_edit": "Edit posts",
86
- "@vitnode/blog:posts:can_delete": "Delete posts",
57
+ "@vitnode/blog:posts": "Articles",
58
+ "@vitnode/blog:posts:can_view": "View articles list",
59
+ "@vitnode/blog:posts:can_create": "Create articles",
60
+ "@vitnode/blog:posts:can_edit": "Edit articles",
61
+ "@vitnode/blog:posts:can_delete": "Delete articles",
62
+ "@vitnode/blog:posts:can_publish": "Publish and unpublish articles",
63
+ "@vitnode/blog:posts:can_restore": "Restore an earlier version of an article",
87
64
  "@vitnode/blog:categories": "Categories",
88
65
  "@vitnode/blog:categories:can_view": "View categories list",
89
66
  "@vitnode/blog:categories:can_create": "Create categories",
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/locales/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAMtE,QAAA,MAAM,QAAQ,EAAE,iBAEf,CAAC;AAEF,eAAe,QAAQ,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/locales/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAMtE,QAAA,MAAM,QAAQ,EAAE,iBAGf,CAAC;AAEF,eAAe,QAAQ,CAAC"}
@@ -1 +1 @@
1
- const messages={en:async()=>await import("./en.json",{with:{type:"json"}})};export default messages;
1
+ const messages={en:async()=>await import("./en.json",{with:{type:"json"}}),pl:async()=>await import("./pl.json",{with:{type:"json"}})};export default messages;
@@ -0,0 +1,69 @@
1
+ {
2
+ "@vitnode/blog": {
3
+ "title": "Blog",
4
+ "content": {
5
+ "post": {
6
+ "label": "{count, plural, one {Artykuł} few {Artykuły} many {Artykułów} other {Artykułu}}",
7
+ "title": "Artykuły",
8
+ "desc": "Pisz artykuły na blogu i zarządzaj nimi.",
9
+ "fields": {
10
+ "title": "Tytuł",
11
+ "friendlyUrl": "Przyjazny adres URL",
12
+ "content": "Treść",
13
+ "categoryId": "Kategoria",
14
+ "authorId": "Autor",
15
+ "coverImage": "Obraz wyróżniający",
16
+ "coverImageAlt": "Tekst alternatywny obrazu",
17
+ "status": "Status",
18
+ "publishedAt": "Opublikowano",
19
+ "updatedAt": "Zaktualizowano"
20
+ }
21
+ },
22
+ "category": {
23
+ "label": "{count, plural, one {Kategoria} few {Kategorie} many {Kategorii} other {Kategorii}}",
24
+ "title": "Kategorie",
25
+ "desc": "Grupuj artykuły razem.",
26
+ "fields": {
27
+ "name": "Nazwa",
28
+ "color": "Kolor",
29
+ "updatedAt": "Zaktualizowano"
30
+ }
31
+ }
32
+ },
33
+ "admin": {
34
+ "article": {
35
+ "content": {
36
+ "label": "Treść"
37
+ },
38
+ "form": {
39
+ "publish": "Publikacja",
40
+ "cover": {
41
+ "title": "Obraz wyróżniający"
42
+ },
43
+ "settings": {
44
+ "title": "Ustawienia artykułu"
45
+ }
46
+ }
47
+ },
48
+ "category": {
49
+ "color": {
50
+ "label": "Kolor",
51
+ "desc": "Wyświetlany obok kategorii na listach.",
52
+ "none": "Brak koloru"
53
+ }
54
+ }
55
+ }
56
+ },
57
+ "@vitnode/blog:posts": "Artykuły",
58
+ "@vitnode/blog:posts:can_view": "Wyświetlanie listy artykułów",
59
+ "@vitnode/blog:posts:can_create": "Tworzenie artykułów",
60
+ "@vitnode/blog:posts:can_edit": "Edytowanie artykułów",
61
+ "@vitnode/blog:posts:can_delete": "Usuwanie artykułów",
62
+ "@vitnode/blog:posts:can_publish": "Publikowanie i cofanie publikacji artykułów",
63
+ "@vitnode/blog:posts:can_restore": "Przywracanie wcześniejszej wersji artykułu",
64
+ "@vitnode/blog:categories": "Kategorie",
65
+ "@vitnode/blog:categories:can_view": "Wyświetlanie listy kategorii",
66
+ "@vitnode/blog:categories:can_create": "Tworzenie kategorii",
67
+ "@vitnode/blog:categories:can_edit": "Edytowanie kategorii",
68
+ "@vitnode/blog:categories:can_delete": "Usuwanie kategorii"
69
+ }
@@ -0,0 +1,4 @@
1
+ import type { ItemAutoFormComponentProps } from "@vitnode/core/components/form/auto-form";
2
+ import React from "react";
3
+ export declare const BlogArticleEditorField: (props: ItemAutoFormComponentProps) => React.JSX.Element;
4
+ //# sourceMappingURL=editor-field.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editor-field.d.ts","sourceRoot":"","sources":["../../../../../src/views/admin/article/editor-field.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,yCAAyC,CAAC;AAG1F,OAAO,KAAK,MAAM,OAAO,CAAC;AA8B1B,eAAO,MAAM,sBAAsB,GAAI,OAAO,0BAA0B,sBAQvE,CAAC"}
@@ -0,0 +1 @@
1
+ "use client";import{jsx as _jsx}from"react/jsx-runtime";import{Loader}from"@vitnode/core/components/ui/loader";import React from"react";import{useTranslations}from"use-intl";const AutoFormEditor=React.lazy(async()=>await import("@vitnode/core/components/form/fields/editor").then(mod=>({default:mod.AutoFormEditor})));export const BlogArticleEditorField=props=>{const t=useTranslations("@vitnode/blog.admin.article");return _jsx(React.Suspense,{fallback:_jsx(Loader,{}),children:_jsx(AutoFormEditor,{label:t("content.label"),...props})})};
@@ -0,0 +1,3 @@
1
+ import type { ContentFormLayoutProps } from "@vitnode/core/lib/plugin";
2
+ export declare const BlogArticleFormLayout: ({ mode }: ContentFormLayoutProps) => import("react").JSX.Element;
3
+ //# sourceMappingURL=form-layout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form-layout.d.ts","sourceRoot":"","sources":["../../../../../src/views/admin/article/form-layout.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAcvE,eAAO,MAAM,qBAAqB,GAAI,UAAU,sBAAsB,gCAsCrE,CAAC"}
@@ -0,0 +1 @@
1
+ "use client";import{jsx as _jsx,jsxs as _jsxs,Fragment as _Fragment}from"react/jsx-runtime";import{ContentFormActions,ContentFormField,ContentFormHeader,ContentFormLayoutGrid,ContentFormMain,ContentFormSection,ContentFormSidebar,ContentFormStatus}from"@vitnode/core/content/admin-form";import{useTranslations}from"use-intl";export const BlogArticleFormLayout=({mode})=>{const t=useTranslations("@vitnode/blog.admin.article.form");return _jsxs(_Fragment,{children:[_jsx(ContentFormHeader,{children:_jsx(ContentFormActions,{})}),_jsxs(ContentFormLayoutGrid,{children:[_jsx(ContentFormMain,{children:_jsxs(ContentFormSection,{children:[_jsx(ContentFormField,{name:"title"}),_jsx(ContentFormField,{name:"friendlyUrl"}),_jsx(ContentFormField,{name:"content"})]})}),_jsxs(ContentFormSidebar,{children:[mode==="edit"?_jsx(ContentFormSection,{title:t("publish"),children:_jsx(ContentFormStatus,{})}):null,_jsxs(ContentFormSection,{title:t("cover.title"),children:[_jsx(ContentFormField,{name:"coverImage"}),_jsx(ContentFormField,{name:"coverImageAlt"})]}),_jsxs(ContentFormSection,{title:t("settings.title"),children:[_jsx(ContentFormField,{name:"categoryId"}),_jsx(ContentFormField,{name:"authorId"})]})]})]})]})};
@@ -0,0 +1,4 @@
1
+ import type { ContentCellProps } from "@vitnode/core/lib/plugin";
2
+ import type { blogCategoryContentType } from "../../../content/category";
3
+ export declare const BlogCategoryColorCell: ({ row, }: ContentCellProps<typeof blogCategoryContentType>) => import("react").JSX.Element;
4
+ //# sourceMappingURL=color-cell.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"color-cell.d.ts","sourceRoot":"","sources":["../../../../../src/views/admin/category/color-cell.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAIjE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAElE,eAAO,MAAM,qBAAqB,GAAI,UAEnC,gBAAgB,CAAC,OAAO,uBAAuB,CAAC,gCAkBlD,CAAC"}
@@ -0,0 +1 @@
1
+ "use client";import{jsx as _jsx,jsxs as _jsxs}from"react/jsx-runtime";import{useTranslations}from"use-intl";export const BlogCategoryColorCell=({row})=>{const t=useTranslations("@vitnode/blog.admin.category");const color=row.color;if(!color){return _jsx("span",{className:"text-muted-foreground",children:t("color.none")})}return _jsxs("div",{className:"flex items-center gap-2",children:[_jsx("span",{"aria-hidden":true,className:"size-4 shrink-0 rounded-full border",style:{backgroundColor:color}}),_jsx("span",{className:"text-muted-foreground truncate text-sm",children:color})]})};
@@ -0,0 +1,3 @@
1
+ import type { ItemAutoFormComponentProps } from "@vitnode/core/components/form/auto-form";
2
+ export declare const BlogCategoryColorField: (props: ItemAutoFormComponentProps) => import("react").JSX.Element;
3
+ //# sourceMappingURL=color-field.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"color-field.d.ts","sourceRoot":"","sources":["../../../../../src/views/admin/category/color-field.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,yCAAyC,CAAC;AAK1F,eAAO,MAAM,sBAAsB,GAAI,OAAO,0BAA0B,gCAWvE,CAAC"}
@@ -0,0 +1 @@
1
+ "use client";import{jsx as _jsx}from"react/jsx-runtime";import{AutoFormColor}from"@vitnode/core/components/form/fields/color";import{useTranslations}from"use-intl";export const BlogCategoryColorField=props=>{const t=useTranslations("@vitnode/blog.admin.category");return _jsx(AutoFormColor,{allowRemoveColor:true,description:t("color.desc"),label:t("color.label"),...props})};
@@ -0,0 +1,3 @@
1
+ declare const _default: import("vite").UserConfig;
2
+ export default _default;
3
+ //# sourceMappingURL=vitest.config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vitest.config.d.ts","sourceRoot":"","sources":["../vitest.config.ts"],"names":[],"mappings":";AAIA,wBAgBG"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@vitnode/blog",
3
- "version": "1.2.0-canary.77",
4
- "description": "Blog plugin for VitNode, providing a blogging platform with Next.js and Hono.js.",
3
+ "version": "2.0.0-canary.1",
4
+ "description": "Blog plugin for VitNode, providing a blogging platform on Hono.js.",
5
5
  "author": "VitNode Team",
6
6
  "license": "MIT",
7
7
  "homepage": "https://vitnode.com",
@@ -14,7 +14,6 @@
14
14
  "vitnode",
15
15
  "react",
16
16
  "hono.js",
17
- "next.js",
18
17
  "typescript",
19
18
  "blog"
20
19
  ],
@@ -29,19 +28,19 @@
29
28
  },
30
29
  "dependencies": {
31
30
  "@hono/zod-openapi": "^1.5.1",
32
- "drizzle-kit": "^0.31.10",
33
- "drizzle-orm": "^0.45.2",
31
+ "ai": "^7.0.37",
32
+ "drizzle-kit": "1.0.0-rc.4",
33
+ "drizzle-orm": "1.0.0-rc.4",
34
34
  "hono": "^4.12.31",
35
35
  "lucide-react": "^1.25.0",
36
- "next": "16.3.0-preview.9",
37
- "next-intl": "^4.13.3",
38
36
  "react": "^19.2.8",
39
37
  "react-dom": "^19.2.8",
40
38
  "react-email": "^6.9.0",
41
39
  "react-hook-form": "^7.82.0",
42
40
  "sonner": "^2.0.7",
41
+ "use-intl": "^4.13.7",
43
42
  "zod": "^4.4.3",
44
- "@vitnode/core": "1.2.0-canary.77"
43
+ "@vitnode/core": "2.0.0-canary.1"
45
44
  },
46
45
  "devDependencies": {
47
46
  "@react-email/ui": "^6.9.0",
@@ -49,16 +48,23 @@
49
48
  "@swc/core": "^1.15.46",
50
49
  "@types/react": "^19.2.17",
51
50
  "@types/react-dom": "^19.2.3",
51
+ "@vitejs/plugin-react": "^6.0.4",
52
52
  "eslint": "^10.7.0",
53
+ "jsdom": "^29.1.1",
54
+ "postgres": "^3.4.9",
53
55
  "tsc-alias": "^1.9.1",
54
56
  "typescript": "^6.0.3",
55
- "@vitnode/config": "1.2.0-canary.77"
57
+ "vitest": "^4.1.10",
58
+ "@vitnode/config": "2.0.0-canary.1"
56
59
  },
57
60
  "scripts": {
58
61
  "build:plugins": "vitnode build",
59
62
  "dev": "vitnode dev",
60
63
  "dev:email": "email dev --dir src/emails",
61
64
  "lint": "eslint .",
62
- "lint:fix": "eslint . --fix"
65
+ "lint:fix": "eslint . --fix",
66
+ "test": "vitest run",
67
+ "test:watch": "vitest",
68
+ "test:types": "vitest run --typecheck.only"
63
69
  }
64
70
  }
@@ -1,89 +1,66 @@
1
1
  {
2
2
  "@vitnode/blog": {
3
3
  "title": "Blog",
4
- "admin": {
5
- "nav": {
6
- "posts": "Posts",
7
- "categories": "Categories"
8
- },
9
- "categories": {
10
- "desc": "Manage categories for blog posts.",
11
- "table": {
4
+ "content": {
5
+ "post": {
6
+ "label": "{count, plural, one {Article} other {Articles}}",
7
+ "title": "Articles",
8
+ "desc": "Write and manage your blog articles.",
9
+ "fields": {
12
10
  "title": "Title",
11
+ "friendlyUrl": "Friendly URL",
12
+ "content": "Content",
13
+ "categoryId": "Categories",
14
+ "authorId": "Authors",
15
+ "coverImage": "Cover image",
16
+ "coverImageAlt": "Cover image alt text",
17
+ "status": "Status",
18
+ "publishedAt": "Published",
19
+ "updatedAt": "Updated"
20
+ }
21
+ },
22
+ "category": {
23
+ "label": "{count, plural, one {Category} other {Categories}}",
24
+ "title": "Categories",
25
+ "desc": "Group articles together.",
26
+ "fields": {
27
+ "name": "Name",
13
28
  "color": "Color",
14
- "updated_at": "Updated At"
15
- },
16
- "delete": {
17
- "title": "Delete Category",
18
- "desc": "Are you sure you want to delete <title></title> category? This action cannot be undone.",
19
- "confirm": "Yes, delete this category",
20
- "success": "Category has been deleted successfully."
29
+ "updatedAt": "Updated"
30
+ }
31
+ }
32
+ },
33
+ "admin": {
34
+ "article": {
35
+ "content": {
36
+ "label": "Content"
21
37
  },
22
- "create": {
23
- "title": "Create Category",
24
- "desc": "A new category for your blog posts.",
25
- "form": {
26
- "title": {
27
- "label": "Title",
28
- "already_exists": "This category title already exists."
29
- },
30
- "color": "Color"
38
+ "form": {
39
+ "publish": "Publish",
40
+ "cover": {
41
+ "title": "Cover image"
31
42
  },
32
- "submit": "Create",
33
- "success": "Category has been created successfully."
34
- },
35
- "edit": {
36
- "title": "Edit Category",
37
- "submit": "Save Changes",
38
- "success": "Category has been updated successfully."
43
+ "settings": {
44
+ "title": "Article settings"
45
+ }
39
46
  }
40
47
  },
41
- "posts": {
42
- "desc": "Write and manage your blog posts.",
43
- "table": {
44
- "title": "Title",
45
- "category": "Category",
46
- "author": "Author",
47
- "updated_at": "Updated At"
48
- },
49
- "create": {
50
- "title": "Create Post",
51
- "desc": "Write a new article for your blog.",
52
- "form": {
53
- "title": {
54
- "label": "Title",
55
- "already_exists": "This post title already exists."
56
- },
57
- "friendly_url": {
58
- "label": "Friendly URL",
59
- "desc": "Used in the post address. Auto-filled from the title.",
60
- "already_exists": "This friendly URL already exists."
61
- },
62
- "content": "Content",
63
- "category": "Category"
64
- },
65
- "submit": "Create Post",
66
- "success": "Post has been created successfully."
67
- },
68
- "edit": {
69
- "title": "Edit Post",
70
- "submit": "Save Changes",
71
- "success": "Post has been updated successfully."
72
- },
73
- "delete": {
74
- "title": "Delete Post",
75
- "desc": "Are you sure you want to delete <title></title> post? This action cannot be undone.",
76
- "confirm": "Yes, delete this post",
77
- "success": "Post has been deleted successfully."
48
+ "category": {
49
+ "color": {
50
+ "label": "Color",
51
+ "desc": "Shown next to the category in lists.",
52
+ "none": "No color"
78
53
  }
79
54
  }
80
55
  }
81
56
  },
82
- "@vitnode/blog:posts": "Posts",
83
- "@vitnode/blog:posts:can_view": "View posts list",
84
- "@vitnode/blog:posts:can_create": "Create posts",
85
- "@vitnode/blog:posts:can_edit": "Edit posts",
86
- "@vitnode/blog:posts:can_delete": "Delete posts",
57
+ "@vitnode/blog:posts": "Articles",
58
+ "@vitnode/blog:posts:can_view": "View articles list",
59
+ "@vitnode/blog:posts:can_create": "Create articles",
60
+ "@vitnode/blog:posts:can_edit": "Edit articles",
61
+ "@vitnode/blog:posts:can_delete": "Delete articles",
62
+ "@vitnode/blog:posts:can_publish": "Publish and unpublish articles",
63
+ "@vitnode/blog:posts:can_restore": "Restore an earlier version of an article",
87
64
  "@vitnode/blog:categories": "Categories",
88
65
  "@vitnode/blog:categories:can_view": "View categories list",
89
66
  "@vitnode/blog:categories:can_create": "Create categories",
@@ -6,6 +6,7 @@ import type { LocaleMessagesMap } from "@vitnode/core/lib/i18n/types";
6
6
  */
7
7
  const messages: LocaleMessagesMap = {
8
8
  en: async () => await import("./en.json", { with: { type: "json" } }),
9
+ pl: async () => await import("./pl.json", { with: { type: "json" } }),
9
10
  };
10
11
 
11
12
  export default messages;