@vitnode/blog 1.2.0-canary.76 → 1.2.0-canary.78

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 (194) hide show
  1. package/dist/src/api/lib/categories-language.d.ts +10 -0
  2. package/dist/src/api/lib/categories-language.d.ts.map +1 -0
  3. package/dist/src/api/lib/categories-language.js +1 -0
  4. package/dist/src/api/lib/events.d.ts +28 -0
  5. package/dist/src/api/lib/events.d.ts.map +1 -0
  6. package/dist/src/api/lib/events.js +1 -0
  7. package/dist/src/api/lib/posts-language.d.ts +17 -0
  8. package/dist/src/api/lib/posts-language.d.ts.map +1 -0
  9. package/dist/src/api/lib/posts-language.js +1 -0
  10. package/dist/src/api/lib/search.d.ts +13 -0
  11. package/dist/src/api/lib/search.d.ts.map +1 -0
  12. package/dist/src/api/lib/search.js +1 -0
  13. package/dist/src/api/modules/admin/admin.module.d.ts +197 -180
  14. package/dist/src/api/modules/admin/admin.module.d.ts.map +1 -1
  15. package/dist/src/api/modules/admin/admin.module.js +1 -2
  16. package/dist/src/api/modules/admin/categories/categories.admin.module.d.ts +83 -80
  17. package/dist/src/api/modules/admin/categories/categories.admin.module.d.ts.map +1 -1
  18. package/dist/src/api/modules/admin/categories/categories.admin.module.js +1 -2
  19. package/dist/src/api/modules/admin/categories/routes/create.route.d.ts +38 -34
  20. package/dist/src/api/modules/admin/categories/routes/create.route.d.ts.map +1 -1
  21. package/dist/src/api/modules/admin/categories/routes/create.route.js +1 -2
  22. package/dist/src/api/modules/admin/categories/routes/delete.route.d.ts +15 -18
  23. package/dist/src/api/modules/admin/categories/routes/delete.route.d.ts.map +1 -1
  24. package/dist/src/api/modules/admin/categories/routes/delete.route.js +1 -2
  25. package/dist/src/api/modules/admin/categories/routes/edit.route.d.ts +38 -38
  26. package/dist/src/api/modules/admin/categories/routes/edit.route.d.ts.map +1 -1
  27. package/dist/src/api/modules/admin/categories/routes/edit.route.js +1 -2
  28. package/dist/src/api/modules/admin/posts/posts.admin.module.d.ts +104 -93
  29. package/dist/src/api/modules/admin/posts/posts.admin.module.d.ts.map +1 -1
  30. package/dist/src/api/modules/admin/posts/posts.admin.module.js +1 -2
  31. package/dist/src/api/modules/admin/posts/routes/create.route.d.ts +58 -44
  32. package/dist/src/api/modules/admin/posts/routes/create.route.d.ts.map +1 -1
  33. package/dist/src/api/modules/admin/posts/routes/create.route.js +1 -2
  34. package/dist/src/api/modules/admin/posts/routes/delete.route.d.ts +15 -18
  35. package/dist/src/api/modules/admin/posts/routes/delete.route.d.ts.map +1 -1
  36. package/dist/src/api/modules/admin/posts/routes/delete.route.js +1 -2
  37. package/dist/src/api/modules/admin/posts/routes/edit.route.d.ts +47 -43
  38. package/dist/src/api/modules/admin/posts/routes/edit.route.d.ts.map +1 -1
  39. package/dist/src/api/modules/admin/posts/routes/edit.route.js +1 -2
  40. package/dist/src/api/modules/categories/categories.module.d.ts +65 -64
  41. package/dist/src/api/modules/categories/categories.module.d.ts.map +1 -1
  42. package/dist/src/api/modules/categories/categories.module.js +1 -2
  43. package/dist/src/api/modules/categories/routes/get.route.d.ts +56 -45
  44. package/dist/src/api/modules/categories/routes/get.route.d.ts.map +1 -1
  45. package/dist/src/api/modules/categories/routes/get.route.js +1 -2
  46. package/dist/src/api/modules/categories/test.route.d.ts +20 -23
  47. package/dist/src/api/modules/categories/test.route.d.ts.map +1 -1
  48. package/dist/src/api/modules/categories/test.route.js +1 -2
  49. package/dist/src/api/modules/posts/posts.module.d.ts +68 -54
  50. package/dist/src/api/modules/posts/posts.module.d.ts.map +1 -1
  51. package/dist/src/api/modules/posts/posts.module.js +1 -2
  52. package/dist/src/api/modules/posts/routes/get.route.d.ts +97 -66
  53. package/dist/src/api/modules/posts/routes/get.route.d.ts.map +1 -1
  54. package/dist/src/api/modules/posts/routes/get.route.js +1 -2
  55. package/dist/src/config.api.d.ts +1 -4
  56. package/dist/src/config.api.d.ts.map +1 -1
  57. package/dist/src/config.api.js +1 -2
  58. package/dist/src/config.d.ts +1 -4
  59. package/dist/src/config.d.ts.map +1 -1
  60. package/dist/src/config.js +1 -2
  61. package/dist/src/const.d.ts +2 -5
  62. package/dist/src/const.d.ts.map +1 -1
  63. package/dist/src/const.js +1 -2
  64. package/dist/src/database/categories.d.ts +76 -98
  65. package/dist/src/database/categories.d.ts.map +1 -1
  66. package/dist/src/database/categories.js +1 -2
  67. package/dist/src/database/index.d.ts +4 -4
  68. package/dist/src/database/index.d.ts.map +1 -0
  69. package/dist/src/database/index.js +1 -1
  70. package/dist/src/database/posts.d.ts +91 -132
  71. package/dist/src/database/posts.d.ts.map +1 -1
  72. package/dist/src/database/posts.js +1 -2
  73. package/dist/src/database/relations.d.ts +4 -7
  74. package/dist/src/database/relations.d.ts.map +1 -1
  75. package/dist/src/database/relations.js +1 -2
  76. package/dist/src/emails/test-template.d.ts +18 -20
  77. package/dist/src/emails/test-template.d.ts.map +1 -1
  78. package/dist/src/emails/test-template.js +1 -2
  79. package/dist/src/globals.css +44 -0
  80. package/dist/src/locales/en.json +92 -0
  81. package/dist/src/locales/index.d.ts +4 -0
  82. package/dist/src/locales/index.d.ts.map +1 -0
  83. package/dist/src/locales/index.js +1 -0
  84. package/dist/src/routes/admin/blog/categories/page.d.ts +5 -7
  85. package/dist/src/routes/admin/blog/categories/page.d.ts.map +1 -1
  86. package/dist/src/routes/admin/blog/categories/page.js +1 -2
  87. package/dist/src/routes/admin/blog/posts/page.d.ts +5 -7
  88. package/dist/src/routes/admin/blog/posts/page.d.ts.map +1 -1
  89. package/dist/src/routes/admin/blog/posts/page.js +1 -2
  90. package/dist/src/routes/breadcrumb/admin/blog/categories/page.d.ts +2 -0
  91. package/dist/src/routes/breadcrumb/admin/blog/categories/page.d.ts.map +1 -0
  92. package/dist/src/routes/breadcrumb/admin/blog/categories/page.js +1 -0
  93. package/dist/src/routes/breadcrumb/admin/blog/posts/page.d.ts +2 -0
  94. package/dist/src/routes/breadcrumb/admin/blog/posts/page.d.ts.map +1 -0
  95. package/dist/src/routes/breadcrumb/admin/blog/posts/page.js +1 -0
  96. package/dist/src/views/admin/categories/actions/actions.d.ts +1 -4
  97. package/dist/src/views/admin/categories/actions/actions.d.ts.map +1 -1
  98. package/dist/src/views/admin/categories/actions/actions.js +1 -2
  99. package/dist/src/views/admin/categories/actions/create-edit/create-edit.d.ts +5 -8
  100. package/dist/src/views/admin/categories/actions/create-edit/create-edit.d.ts.map +1 -1
  101. package/dist/src/views/admin/categories/actions/create-edit/create-edit.js +1 -2
  102. package/dist/src/views/admin/categories/actions/create-edit/mutation-api.server.d.ts +11 -0
  103. package/dist/src/views/admin/categories/actions/create-edit/mutation-api.server.d.ts.map +1 -0
  104. package/dist/src/views/admin/categories/actions/create-edit/mutation-api.server.js +1 -0
  105. package/dist/src/views/admin/categories/table/actions/delete/delete-action.d.ts +3 -6
  106. package/dist/src/views/admin/categories/table/actions/delete/delete-action.d.ts.map +1 -1
  107. package/dist/src/views/admin/categories/table/actions/delete/delete-action.js +1 -2
  108. package/dist/src/views/admin/categories/table/actions/delete/mutation-api.server.d.ts +4 -0
  109. package/dist/src/views/admin/categories/table/actions/delete/mutation-api.server.d.ts.map +1 -0
  110. package/dist/src/views/admin/categories/table/actions/delete/mutation-api.server.js +1 -0
  111. package/dist/src/views/admin/categories/table/actions/edit-action.d.ts +5 -8
  112. package/dist/src/views/admin/categories/table/actions/edit-action.d.ts.map +1 -1
  113. package/dist/src/views/admin/categories/table/actions/edit-action.js +1 -2
  114. package/dist/src/views/admin/categories/table/categories-admin-view.d.ts +2 -5
  115. package/dist/src/views/admin/categories/table/categories-admin-view.d.ts.map +1 -1
  116. package/dist/src/views/admin/categories/table/categories-admin-view.js +1 -2
  117. package/dist/src/views/admin/posts/actions/actions.d.ts +1 -4
  118. package/dist/src/views/admin/posts/actions/actions.d.ts.map +1 -1
  119. package/dist/src/views/admin/posts/actions/actions.js +1 -2
  120. package/dist/src/views/admin/posts/actions/create-edit/create-edit.d.ts +7 -9
  121. package/dist/src/views/admin/posts/actions/create-edit/create-edit.d.ts.map +1 -1
  122. package/dist/src/views/admin/posts/actions/create-edit/create-edit.js +1 -2
  123. package/dist/src/views/admin/posts/actions/create-edit/multi-lang-fields.d.ts +10 -0
  124. package/dist/src/views/admin/posts/actions/create-edit/multi-lang-fields.d.ts.map +1 -0
  125. package/dist/src/views/admin/posts/actions/create-edit/multi-lang-fields.js +1 -0
  126. package/dist/src/views/admin/posts/actions/create-edit/mutation-api.server.d.ts +11 -0
  127. package/dist/src/views/admin/posts/actions/create-edit/mutation-api.server.d.ts.map +1 -0
  128. package/dist/src/views/admin/posts/actions/create-edit/mutation-api.server.js +1 -0
  129. package/dist/src/views/admin/posts/table/actions/delete/delete-action.d.ts +3 -6
  130. package/dist/src/views/admin/posts/table/actions/delete/delete-action.d.ts.map +1 -1
  131. package/dist/src/views/admin/posts/table/actions/delete/delete-action.js +1 -2
  132. package/dist/src/views/admin/posts/table/actions/delete/mutation-api.server.d.ts +4 -0
  133. package/dist/src/views/admin/posts/table/actions/delete/mutation-api.server.d.ts.map +1 -0
  134. package/dist/src/views/admin/posts/table/actions/delete/mutation-api.server.js +1 -0
  135. package/dist/src/views/admin/posts/table/actions/edit-action.d.ts +5 -8
  136. package/dist/src/views/admin/posts/table/actions/edit-action.d.ts.map +1 -1
  137. package/dist/src/views/admin/posts/table/actions/edit-action.js +1 -2
  138. package/dist/src/views/admin/posts/table/posts-admin-view.d.ts +2 -5
  139. package/dist/src/views/admin/posts/table/posts-admin-view.d.ts.map +1 -1
  140. package/dist/src/views/admin/posts/table/posts-admin-view.js +1 -2
  141. package/package.json +20 -18
  142. package/src/locales/en.json +17 -5
  143. package/src/locales/index.ts +11 -0
  144. package/src/routes/breadcrumb/admin/blog/categories/page.tsx +5 -0
  145. package/src/routes/breadcrumb/admin/blog/posts/page.tsx +5 -0
  146. package/dist/src/api/modules/admin/admin.module.js.map +0 -1
  147. package/dist/src/api/modules/admin/categories/categories.admin.module.js.map +0 -1
  148. package/dist/src/api/modules/admin/categories/routes/create.route.js.map +0 -1
  149. package/dist/src/api/modules/admin/categories/routes/delete.route.js.map +0 -1
  150. package/dist/src/api/modules/admin/categories/routes/edit.route.js.map +0 -1
  151. package/dist/src/api/modules/admin/posts/posts.admin.module.js.map +0 -1
  152. package/dist/src/api/modules/admin/posts/routes/create.route.js.map +0 -1
  153. package/dist/src/api/modules/admin/posts/routes/delete.route.js.map +0 -1
  154. package/dist/src/api/modules/admin/posts/routes/edit.route.js.map +0 -1
  155. package/dist/src/api/modules/categories/categories.module.js.map +0 -1
  156. package/dist/src/api/modules/categories/routes/get.route.js.map +0 -1
  157. package/dist/src/api/modules/categories/test.route.js.map +0 -1
  158. package/dist/src/api/modules/posts/posts.module.js.map +0 -1
  159. package/dist/src/api/modules/posts/routes/get.route.js.map +0 -1
  160. package/dist/src/config.api.js.map +0 -1
  161. package/dist/src/config.js.map +0 -1
  162. package/dist/src/const.js.map +0 -1
  163. package/dist/src/database/categories.js.map +0 -1
  164. package/dist/src/database/posts.js.map +0 -1
  165. package/dist/src/database/relations.js.map +0 -1
  166. package/dist/src/emails/test-template.js.map +0 -1
  167. package/dist/src/routes/admin/blog/categories/page.js.map +0 -1
  168. package/dist/src/routes/admin/blog/posts/page.js.map +0 -1
  169. package/dist/src/views/admin/categories/actions/actions.js.map +0 -1
  170. package/dist/src/views/admin/categories/actions/create-edit/create-edit.js.map +0 -1
  171. package/dist/src/views/admin/categories/actions/create-edit/mutation-api.d.ts +0 -14
  172. package/dist/src/views/admin/categories/actions/create-edit/mutation-api.d.ts.map +0 -1
  173. package/dist/src/views/admin/categories/actions/create-edit/mutation-api.js +0 -2
  174. package/dist/src/views/admin/categories/actions/create-edit/mutation-api.js.map +0 -1
  175. package/dist/src/views/admin/categories/table/actions/delete/delete-action.js.map +0 -1
  176. package/dist/src/views/admin/categories/table/actions/delete/mutation-api.d.ts +0 -7
  177. package/dist/src/views/admin/categories/table/actions/delete/mutation-api.d.ts.map +0 -1
  178. package/dist/src/views/admin/categories/table/actions/delete/mutation-api.js +0 -2
  179. package/dist/src/views/admin/categories/table/actions/delete/mutation-api.js.map +0 -1
  180. package/dist/src/views/admin/categories/table/actions/edit-action.js.map +0 -1
  181. package/dist/src/views/admin/categories/table/categories-admin-view.js.map +0 -1
  182. package/dist/src/views/admin/posts/actions/actions.js.map +0 -1
  183. package/dist/src/views/admin/posts/actions/create-edit/create-edit.js.map +0 -1
  184. package/dist/src/views/admin/posts/actions/create-edit/mutation-api.d.ts +0 -14
  185. package/dist/src/views/admin/posts/actions/create-edit/mutation-api.d.ts.map +0 -1
  186. package/dist/src/views/admin/posts/actions/create-edit/mutation-api.js +0 -2
  187. package/dist/src/views/admin/posts/actions/create-edit/mutation-api.js.map +0 -1
  188. package/dist/src/views/admin/posts/table/actions/delete/delete-action.js.map +0 -1
  189. package/dist/src/views/admin/posts/table/actions/delete/mutation-api.d.ts +0 -7
  190. package/dist/src/views/admin/posts/table/actions/delete/mutation-api.d.ts.map +0 -1
  191. package/dist/src/views/admin/posts/table/actions/delete/mutation-api.js +0 -2
  192. package/dist/src/views/admin/posts/table/actions/delete/mutation-api.js.map +0 -1
  193. package/dist/src/views/admin/posts/table/actions/edit-action.js.map +0 -1
  194. package/dist/src/views/admin/posts/table/posts-admin-view.js.map +0 -1
@@ -0,0 +1,10 @@
1
+ import type { MultiLangValue } from "@vitnode/core/lib/helpers/multi-lang";
2
+ import type { Context } from "hono";
3
+ export declare const CATEGORY_LANG_TABLE = "blog_categories";
4
+ export declare const CATEGORY_LANG_VARIABLE = "title";
5
+ export interface CategoryTranslations {
6
+ title: MultiLangValue;
7
+ }
8
+ export declare const saveCategoryTranslations: (c: Context, itemId: number, { title }: CategoryTranslations) => Promise<void>;
9
+ export declare const loadCategoryTranslations: (c: Context, categoryIds: number[]) => Promise<Map<number, MultiLangValue>>;
10
+ //# sourceMappingURL=categories-language.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"categories-language.d.ts","sourceRoot":"","sources":["../../../../src/api/lib/categories-language.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AAC3E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAQpC,eAAO,MAAM,mBAAmB,oBAAoB,CAAC;AACrD,eAAO,MAAM,sBAAsB,UAAU,CAAC;AAE9C,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,cAAc,CAAC;CACvB;AAID,eAAO,MAAM,wBAAwB,GACnC,GAAG,OAAO,EACV,QAAQ,MAAM,EACd,WAAW,oBAAoB,KAC9B,OAAO,CAAC,IAAI,CAQd,CAAC;AAEF,eAAO,MAAM,wBAAwB,GACnC,GAAG,OAAO,EACV,aAAa,MAAM,EAAE,KACpB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAiCrC,CAAC"}
@@ -0,0 +1 @@
1
+ import{saveLanguageWords}from"@vitnode/core/api/lib/save-language-words";import{core_languages_words}from"@vitnode/core/database/languages";import{and,eq,inArray}from"drizzle-orm";import{CONFIG_PLUGIN}from"../../const.js";export const CATEGORY_LANG_TABLE="blog_categories";export const CATEGORY_LANG_VARIABLE="title";export const saveCategoryTranslations=async(c,itemId,{title})=>{await saveLanguageWords(c,{pluginCode:CONFIG_PLUGIN.pluginId,tableName:CATEGORY_LANG_TABLE,variable:CATEGORY_LANG_VARIABLE,itemId,values:title})};export const loadCategoryTranslations=async(c,categoryIds)=>{const result=new Map;if(categoryIds.length===0){return result}const words=await c.get("db").select({itemId:core_languages_words.itemId,languageCode:core_languages_words.languageCode,value:core_languages_words.value}).from(core_languages_words).where(and(eq(core_languages_words.pluginCode,CONFIG_PLUGIN.pluginId),eq(core_languages_words.tableName,CATEGORY_LANG_TABLE),eq(core_languages_words.variable,CATEGORY_LANG_VARIABLE),inArray(core_languages_words.itemId,categoryIds)));for(const id of categoryIds){result.set(id,words.filter(word=>word.itemId===id).map(({languageCode,value})=>({languageCode,value})))}return result};
@@ -0,0 +1,28 @@
1
+ declare module "@vitnode/core/api/models/events" {
2
+ interface VitNodeEvents {
3
+ "blog.category.created": {
4
+ categoryId: number;
5
+ };
6
+ "blog.category.deleted": {
7
+ categoryId: number;
8
+ postIds: number[];
9
+ };
10
+ "blog.category.updated": {
11
+ categoryId: number;
12
+ };
13
+ "blog.post.created": {
14
+ categoryId: number;
15
+ postId: number;
16
+ };
17
+ "blog.post.deleted": {
18
+ categoryId: number;
19
+ postId: number;
20
+ };
21
+ "blog.post.updated": {
22
+ categoryId: number;
23
+ postId: number;
24
+ };
25
+ }
26
+ }
27
+ export declare const cleanupCategorySearchListener: import("@vitnode/core/api/lib/events").BuildEventListenerReturn<keyof import("@vitnode/core/api/models/events").VitNodeEvents>;
28
+ //# sourceMappingURL=events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../../../src/api/lib/events.ts"],"names":[],"mappings":"AAEA,OAAO,QAAQ,iCAAiC,CAAC;IAC/C,UAAU,aAAa;QACrB,uBAAuB,EAAE;YACvB,UAAU,EAAE,MAAM,CAAC;SACpB,CAAC;QACF,uBAAuB,EAAE;YACvB,UAAU,EAAE,MAAM,CAAC;YACnB,OAAO,EAAE,MAAM,EAAE,CAAC;SACnB,CAAC;QACF,uBAAuB,EAAE;YACvB,UAAU,EAAE,MAAM,CAAC;SACpB,CAAC;QACF,mBAAmB,EAAE;YACnB,UAAU,EAAE,MAAM,CAAC;YACnB,MAAM,EAAE,MAAM,CAAC;SAChB,CAAC;QACF,mBAAmB,EAAE;YACnB,UAAU,EAAE,MAAM,CAAC;YACnB,MAAM,EAAE,MAAM,CAAC;SAChB,CAAC;QACF,mBAAmB,EAAE;YACnB,UAAU,EAAE,MAAM,CAAC;YACnB,MAAM,EAAE,MAAM,CAAC;SAChB,CAAC;KACH;CACF;AAED,eAAO,MAAM,6BAA6B,gIAUxC,CAAC"}
@@ -0,0 +1 @@
1
+ import{buildEventListener}from"@vitnode/core/api/lib/events";export const cleanupCategorySearchListener=buildEventListener({event:"blog.category.deleted",name:"cleanup-category-search",description:"Remove search index rows of posts cascade-deleted with a category",handler:async(c,payload)=>{for(const postId of payload.postIds){await c.get("search").delete("blog_post",postId)}}});
@@ -0,0 +1,17 @@
1
+ import type { MultiLangValue } from "@vitnode/core/lib/helpers/multi-lang";
2
+ import type { Context } from "hono";
3
+ export declare const POST_LANG_TABLE = "blog_posts";
4
+ export declare const POST_LANG_VARIABLES: readonly ["title", "content", "friendlyUrl"];
5
+ export type PostLangVariable = (typeof POST_LANG_VARIABLES)[number];
6
+ export interface PostTranslations {
7
+ content: MultiLangValue;
8
+ friendlyUrl: MultiLangValue;
9
+ title: MultiLangValue;
10
+ }
11
+ export declare const slugifyMultiLang: (values: MultiLangValue) => MultiLangValue;
12
+ export declare const getDefaultLanguageCode: (c: Context) => Promise<null | string>;
13
+ export declare const pickDefaultValue: (values: MultiLangValue, defaultLanguageCode: null | string) => string;
14
+ export declare const resolveLangValue: (values: MultiLangValue | undefined, languageCode: string, defaultLanguageCode: null | string) => string;
15
+ export declare const savePostTranslations: (c: Context, itemId: number, translations: PostTranslations) => Promise<void>;
16
+ export declare const loadPostTranslations: (c: Context, postIds: number[]) => Promise<Map<number, PostTranslations>>;
17
+ //# sourceMappingURL=posts-language.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"posts-language.d.ts","sourceRoot":"","sources":["../../../../src/api/lib/posts-language.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AAC3E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAapC,eAAO,MAAM,eAAe,eAAe,CAAC;AAC5C,eAAO,MAAM,mBAAmB,8CAA+C,CAAC;AAChF,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEpE,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,cAAc,CAAC;IACxB,WAAW,EAAE,cAAc,CAAC;IAC5B,KAAK,EAAE,cAAc,CAAC;CACvB;AAED,eAAO,MAAM,gBAAgB,GAAI,QAAQ,cAAc,KAAG,cAIrD,CAAC;AAEN,eAAO,MAAM,sBAAsB,GACjC,GAAG,OAAO,KACT,OAAO,CAAC,IAAI,GAAG,MAAM,CASvB,CAAC;AAKF,eAAO,MAAM,gBAAgB,GAC3B,QAAQ,cAAc,EACtB,qBAAqB,IAAI,GAAG,MAAM,KACjC,MAGC,CAAC;AAKL,eAAO,MAAM,gBAAgB,GAC3B,QAAQ,cAAc,GAAG,SAAS,EAClC,cAAc,MAAM,EACpB,qBAAqB,IAAI,GAAG,MAAM,KACjC,MAEkD,CAAC;AAEtD,eAAO,MAAM,oBAAoB,GAC/B,GAAG,OAAO,EACV,QAAQ,MAAM,EACd,cAAc,gBAAgB,KAC7B,OAAO,CAAC,IAAI,CAed,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAC/B,GAAG,OAAO,EACV,SAAS,MAAM,EAAE,KAChB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAuCvC,CAAC"}
@@ -0,0 +1 @@
1
+ import{saveLanguageWords}from"@vitnode/core/api/lib/save-language-words";import{core_languages,core_languages_words}from"@vitnode/core/database/languages";import{getLangValue}from"@vitnode/core/lib/helpers/multi-lang";import{removeSpecialCharacters}from"@vitnode/core/lib/special-characters";import{and,eq,inArray}from"drizzle-orm";import{CONFIG_PLUGIN}from"../../const.js";export const POST_LANG_TABLE="blog_posts";export const POST_LANG_VARIABLES=["title","content","friendlyUrl"];export const slugifyMultiLang=values=>values.map(({languageCode,value})=>({languageCode,value:removeSpecialCharacters(value)}));export const getDefaultLanguageCode=async c=>{const[language]=await c.get("db").select({code:core_languages.code}).from(core_languages).where(eq(core_languages.default,true)).limit(1);return language?.code??null};export const pickDefaultValue=(values,defaultLanguageCode)=>values.find(item=>item.languageCode===defaultLanguageCode)?.value??values[0]?.value??"";export const resolveLangValue=(values,languageCode,defaultLanguageCode)=>getLangValue(values,languageCode)||pickDefaultValue(values??[],defaultLanguageCode);export const savePostTranslations=async(c,itemId,translations)=>{await Promise.all(POST_LANG_VARIABLES.map(async variable=>{await saveLanguageWords(c,{pluginCode:CONFIG_PLUGIN.pluginId,tableName:POST_LANG_TABLE,variable,itemId,values:variable==="friendlyUrl"?slugifyMultiLang(translations.friendlyUrl):translations[variable]})}))};export const loadPostTranslations=async(c,postIds)=>{const result=new Map;if(postIds.length===0){return result}const words=await c.get("db").select({itemId:core_languages_words.itemId,variable:core_languages_words.variable,languageCode:core_languages_words.languageCode,value:core_languages_words.value}).from(core_languages_words).where(and(eq(core_languages_words.pluginCode,CONFIG_PLUGIN.pluginId),eq(core_languages_words.tableName,POST_LANG_TABLE),inArray(core_languages_words.variable,[...POST_LANG_VARIABLES]),inArray(core_languages_words.itemId,postIds)));for(const id of postIds){result.set(id,{title:words.filter(word=>word.itemId===id&&word.variable==="title").map(({languageCode,value})=>({languageCode,value})),content:words.filter(word=>word.itemId===id&&word.variable==="content").map(({languageCode,value})=>({languageCode,value})),friendlyUrl:words.filter(word=>word.itemId===id&&word.variable==="friendlyUrl").map(({languageCode,value})=>({languageCode,value}))})}return result};
@@ -0,0 +1,13 @@
1
+ import type { SearchIndexer } from "@vitnode/core/api/models/search";
2
+ import type { Context } from "hono";
3
+ interface BlogPostForSearch {
4
+ authorId: null | number;
5
+ categoryId: number;
6
+ createdAt: Date;
7
+ id: number;
8
+ updatedAt?: Date;
9
+ }
10
+ export declare const reindexBlogPost: (c: Context, post: BlogPostForSearch) => Promise<void>;
11
+ export declare const blogPostSearchIndexer: SearchIndexer;
12
+ export {};
13
+ //# sourceMappingURL=search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../../../src/api/lib/search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,aAAa,EACd,MAAM,iCAAiC,CAAC;AACzC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAcpC,UAAU,iBAAiB;IACzB,QAAQ,EAAE,IAAI,GAAG,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,IAAI,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,CAAC,EAAE,IAAI,CAAC;CAClB;AAmDD,eAAO,MAAM,eAAe,GAC1B,GAAG,OAAO,EACV,MAAM,iBAAiB,KACtB,OAAO,CAAC,IAAI,CAoBd,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,aA4CnC,CAAC"}
@@ -0,0 +1 @@
1
+ import{asc,count}from"drizzle-orm";import{blog_posts}from"../../database/posts.js";import{getDefaultLanguageCode,loadPostTranslations,resolveLangValue}from"./posts-language.js";const getEnabledLanguageCodes=c=>c.get("core").i18n.locales.filter(locale=>locale.enabled!==false).map(locale=>locale.code);const buildDocumentsForPost=(post,languageCodes,translations,defaultLanguageCode)=>{const codes=languageCodes.length>0?languageCodes:[""];return codes.map(languageCode=>{const friendlyUrl=resolveLangValue(translations?.friendlyUrl,languageCode,defaultLanguageCode);return{itemType:"blog_post",itemId:post.id,languageCode,authorId:post.authorId,title:resolveLangValue(translations?.title,languageCode,defaultLanguageCode),content:resolveLangValue(translations?.content,languageCode,defaultLanguageCode),containerType:"blog_category",containerId:post.categoryId,url:`/blog/${post.categoryId}/${friendlyUrl}`,isPublic:true,createdAt:post.createdAt,updatedAt:post.updatedAt}})};export const reindexBlogPost=async(c,post)=>{const languageCodes=getEnabledLanguageCodes(c);const[defaultLanguageCode,translations]=await Promise.all([getDefaultLanguageCode(c),loadPostTranslations(c,[post.id])]);await c.get("search").delete("blog_post",post.id);await c.get("search").bulkIndex(buildDocumentsForPost(post,languageCodes,translations.get(post.id),defaultLanguageCode))};export const blogPostSearchIndexer={itemType:"blog_post",count:async c=>{const[row]=await c.get("db").select({value:count()}).from(blog_posts);return row?.value??0},load:async(c,offset,limit)=>{const rows=await c.get("db").select({id:blog_posts.id,categoryId:blog_posts.categoryId,authorId:blog_posts.authorId,createdAt:blog_posts.createdAt,updatedAt:blog_posts.updatedAt}).from(blog_posts).orderBy(asc(blog_posts.id)).limit(limit).offset(offset);if(rows.length===0){return[]}const languageCodes=getEnabledLanguageCodes(c);const[defaultLanguageCode,translations]=await Promise.all([getDefaultLanguageCode(c),loadPostTranslations(c,rows.map(row=>row.id))]);return rows.flatMap(post=>buildDocumentsForPost(post,languageCodes,translations.get(post.id),defaultLanguageCode))}};
@@ -1,202 +1,219 @@
1
- //#region src/api/modules/admin/admin.module.d.ts
2
- declare const adminModule: import("@vitnode/core/api/lib/module").BuildModuleReturn<"@vitnode/blog", "admin", [], (import("@vitnode/core/api/lib/module").BuildModuleReturn<"@vitnode/blog", "posts", [import("@vitnode/core/api/lib/route").Route<"@vitnode/blog", {
3
- method: "put";
4
- path: "/{id}";
5
- request: {
6
- params: import("zod").ZodObject<{
7
- id: import("zod").ZodPipe<import("zod").ZodString, import("zod").ZodTransform<number, string>>;
8
- }, import("zod/v4/core").$strip>;
9
- body: {
10
- content: {
11
- "application/json": {
12
- schema: import("zod").ZodObject<{
13
- title: import("zod").ZodString;
14
- content: import("zod").ZodString;
15
- categoryId: import("zod").ZodNumber;
16
- }, import("zod/v4/core").$strip>;
17
- };
18
- };
19
- };
20
- };
21
- responses: {
22
- 200: {
23
- content: {
24
- "application/json": {
25
- schema: import("zod").ZodObject<{
26
- id: import("zod").ZodNumber;
27
- title: import("zod").ZodString;
28
- titleSeo: import("zod").ZodString;
29
- content: import("zod").ZodString;
30
- categoryId: import("zod").ZodNumber;
31
- createdAt: import("zod").ZodDate;
32
- updatedAt: import("zod").ZodDate;
33
- }, import("zod/v4/core").$strip>;
34
- };
35
- };
36
- description: string;
37
- };
38
- 400: {
39
- description: string;
1
+ export declare const adminModule: import("@vitnode/core/api/lib/module").BuildModuleReturn<"@vitnode/blog", "admin", [], (import("@vitnode/core/api/lib/module").BuildModuleReturn<"@vitnode/blog", "categories", [import("@vitnode/core/api/lib/route").Route<"@vitnode/blog", {
2
+ method: "post";
3
+ path: "/";
4
+ request: {
5
+ body: {
6
+ content: {
7
+ "application/json": {
8
+ schema: import("zod").ZodObject<{
9
+ title: import("zod").ZodArray<import("zod").ZodObject<{
10
+ languageCode: import("zod").ZodString;
11
+ value: import("zod").ZodString;
12
+ }, import("zod/v4/core").$strip>>;
13
+ color: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodString>>;
14
+ }, import("zod/v4/core").$strip>;
15
+ };
16
+ };
17
+ };
40
18
  };
41
- 404: {
42
- description: string;
19
+ responses: {
20
+ 201: {
21
+ content: {
22
+ "application/json": {
23
+ schema: import("zod").ZodObject<{
24
+ id: import("zod").ZodNumber;
25
+ createdAt: import("zod").ZodDate;
26
+ updatedAt: import("zod").ZodDate;
27
+ }, import("zod/v4/core").$strip>;
28
+ };
29
+ };
30
+ description: string;
31
+ };
32
+ 400: {
33
+ description: string;
34
+ };
43
35
  };
44
- };
45
36
  } & {
46
- path: string;
37
+ path: string;
47
38
  }>, import("@vitnode/core/api/lib/route").Route<"@vitnode/blog", {
48
- method: "post";
49
- path: "/";
50
- request: {
51
- body: {
52
- content: {
53
- "application/json": {
54
- schema: import("zod").ZodObject<{
55
- title: import("zod").ZodString;
56
- content: import("zod").ZodString;
57
- categoryId: import("zod").ZodNumber;
58
- }, import("zod/v4/core").$strip>;
59
- };
60
- };
61
- };
62
- };
63
- responses: {
64
- 201: {
65
- content: {
66
- "application/json": {
67
- schema: import("zod").ZodObject<{
68
- id: import("zod").ZodNumber;
69
- title: import("zod").ZodString;
70
- titleSeo: import("zod").ZodString;
71
- content: import("zod").ZodString;
72
- categoryId: import("zod").ZodNumber;
73
- createdAt: import("zod").ZodDate;
74
- updatedAt: import("zod").ZodDate;
75
- }, import("zod/v4/core").$strip>;
76
- };
77
- };
78
- description: string;
79
- };
80
- 400: {
81
- description: string;
39
+ method: "put";
40
+ path: "/{id}";
41
+ request: {
42
+ params: import("zod").ZodObject<{
43
+ id: import("zod").ZodPipe<import("zod").ZodString, import("zod").ZodTransform<number, string>>;
44
+ }, import("zod/v4/core").$strip>;
45
+ body: {
46
+ content: {
47
+ "application/json": {
48
+ schema: import("zod").ZodObject<{
49
+ title: import("zod").ZodArray<import("zod").ZodObject<{
50
+ languageCode: import("zod").ZodString;
51
+ value: import("zod").ZodString;
52
+ }, import("zod/v4/core").$strip>>;
53
+ color: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodString>>;
54
+ }, import("zod/v4/core").$strip>;
55
+ };
56
+ };
57
+ };
82
58
  };
83
- 404: {
84
- description: string;
59
+ responses: {
60
+ 200: {
61
+ content: {
62
+ "application/json": {
63
+ schema: import("zod").ZodObject<{
64
+ id: import("zod").ZodNumber;
65
+ createdAt: import("zod").ZodDate;
66
+ updatedAt: import("zod").ZodDate;
67
+ }, import("zod/v4/core").$strip>;
68
+ };
69
+ };
70
+ description: string;
71
+ };
72
+ 400: {
73
+ description: string;
74
+ };
75
+ 404: {
76
+ description: string;
77
+ };
85
78
  };
86
- };
87
79
  } & {
88
- path: string;
80
+ path: string;
89
81
  }>, import("@vitnode/core/api/lib/route").Route<"@vitnode/blog", {
90
- method: "delete";
91
- path: "/{id}";
92
- request: {
93
- params: import("zod").ZodObject<{
94
- id: import("zod").ZodPipe<import("zod").ZodString, import("zod").ZodTransform<number, string>>;
95
- }, import("zod/v4/core").$strip>;
96
- };
97
- responses: {
98
- 204: {
99
- description: string;
100
- };
101
- 404: {
102
- description: string;
82
+ method: "delete";
83
+ path: "/{id}";
84
+ request: {
85
+ params: import("zod").ZodObject<{
86
+ id: import("zod").ZodPipe<import("zod").ZodString, import("zod").ZodTransform<number, string>>;
87
+ }, import("zod/v4/core").$strip>;
88
+ };
89
+ responses: {
90
+ 204: {
91
+ description: string;
92
+ };
93
+ 404: {
94
+ description: string;
95
+ };
103
96
  };
104
- };
105
97
  } & {
106
- path: string;
107
- }>], import("@vitnode/core/api/lib/module").BaseBuildModuleReturn<"@vitnode/blog", string, import("@vitnode/core/api/lib/route").Route<"@vitnode/blog", import("@hono/zod-openapi").RouteConfig>[]>[]> | import("@vitnode/core/api/lib/module").BuildModuleReturn<"@vitnode/blog", "categories", [import("@vitnode/core/api/lib/route").Route<"@vitnode/blog", {
108
- method: "post";
109
- path: "/";
110
- request: {
111
- body: {
112
- content: {
113
- "application/json": {
114
- schema: import("zod").ZodObject<{
115
- title: import("zod").ZodString;
116
- }, import("zod/v4/core").$strip>;
117
- };
118
- };
119
- };
120
- };
121
- responses: {
122
- 201: {
123
- content: {
124
- "application/json": {
125
- schema: import("zod").ZodObject<{
126
- id: import("zod").ZodNumber;
127
- title: import("zod").ZodString;
128
- createdAt: import("zod").ZodDate;
129
- updatedAt: import("zod").ZodDate;
130
- }, import("zod/v4/core").$strip>;
131
- };
132
- };
133
- description: string;
98
+ path: string;
99
+ }>], import("@vitnode/core/api/lib/module").BaseBuildModuleReturn<"@vitnode/blog", string, import("@vitnode/core/api/lib/route").Route<"@vitnode/blog", import("@hono/zod-openapi").RouteConfig>[]>[]> | import("@vitnode/core/api/lib/module").BuildModuleReturn<"@vitnode/blog", "posts", [import("@vitnode/core/api/lib/route").Route<"@vitnode/blog", {
100
+ method: "put";
101
+ path: "/{id}";
102
+ request: {
103
+ params: import("zod").ZodObject<{
104
+ id: import("zod").ZodPipe<import("zod").ZodString, import("zod").ZodTransform<number, string>>;
105
+ }, import("zod/v4/core").$strip>;
106
+ body: {
107
+ content: {
108
+ "application/json": {
109
+ schema: import("zod").ZodObject<{
110
+ title: import("zod").ZodArray<import("zod").ZodObject<{
111
+ languageCode: import("zod").ZodString;
112
+ value: import("zod").ZodString;
113
+ }, import("zod/v4/core").$strip>>;
114
+ content: import("zod").ZodArray<import("zod").ZodObject<{
115
+ languageCode: import("zod").ZodString;
116
+ value: import("zod").ZodString;
117
+ }, import("zod/v4/core").$strip>>;
118
+ friendlyUrl: import("zod").ZodArray<import("zod").ZodObject<{
119
+ languageCode: import("zod").ZodString;
120
+ value: import("zod").ZodString;
121
+ }, import("zod/v4/core").$strip>>;
122
+ categoryId: import("zod").ZodNumber;
123
+ }, import("zod/v4/core").$strip>;
124
+ };
125
+ };
126
+ };
134
127
  };
135
- 400: {
136
- description: string;
128
+ responses: {
129
+ 200: {
130
+ content: {
131
+ "application/json": {
132
+ schema: import("zod").ZodObject<{
133
+ id: import("zod").ZodNumber;
134
+ categoryId: import("zod").ZodNumber;
135
+ createdAt: import("zod").ZodDate;
136
+ updatedAt: import("zod").ZodDate;
137
+ }, import("zod/v4/core").$strip>;
138
+ };
139
+ };
140
+ description: string;
141
+ };
142
+ 400: {
143
+ description: string;
144
+ };
145
+ 404: {
146
+ description: string;
147
+ };
137
148
  };
138
- };
139
149
  } & {
140
- path: string;
150
+ path: string;
141
151
  }>, import("@vitnode/core/api/lib/route").Route<"@vitnode/blog", {
142
- method: "put";
143
- path: "/{id}";
144
- request: {
145
- params: import("zod").ZodObject<{
146
- id: import("zod").ZodPipe<import("zod").ZodString, import("zod").ZodTransform<number, string>>;
147
- }, import("zod/v4/core").$strip>;
148
- body: {
149
- content: {
150
- "application/json": {
151
- schema: import("zod").ZodObject<{
152
- title: import("zod").ZodString;
153
- }, import("zod/v4/core").$strip>;
154
- };
155
- };
156
- };
157
- };
158
- responses: {
159
- 200: {
160
- content: {
161
- "application/json": {
162
- schema: import("zod").ZodObject<{
163
- id: import("zod").ZodNumber;
164
- title: import("zod").ZodString;
165
- createdAt: import("zod").ZodDate;
166
- updatedAt: import("zod").ZodDate;
167
- }, import("zod/v4/core").$strip>;
168
- };
169
- };
170
- description: string;
171
- };
172
- 400: {
173
- description: string;
152
+ method: "post";
153
+ path: "/";
154
+ request: {
155
+ body: {
156
+ content: {
157
+ "application/json": {
158
+ schema: import("zod").ZodObject<{
159
+ title: import("zod").ZodArray<import("zod").ZodObject<{
160
+ languageCode: import("zod").ZodString;
161
+ value: import("zod").ZodString;
162
+ }, import("zod/v4/core").$strip>>;
163
+ content: import("zod").ZodArray<import("zod").ZodObject<{
164
+ languageCode: import("zod").ZodString;
165
+ value: import("zod").ZodString;
166
+ }, import("zod/v4/core").$strip>>;
167
+ friendlyUrl: import("zod").ZodArray<import("zod").ZodObject<{
168
+ languageCode: import("zod").ZodString;
169
+ value: import("zod").ZodString;
170
+ }, import("zod/v4/core").$strip>>;
171
+ categoryId: import("zod").ZodNumber;
172
+ }, import("zod/v4/core").$strip>;
173
+ };
174
+ };
175
+ };
174
176
  };
175
- 404: {
176
- description: string;
177
+ responses: {
178
+ 201: {
179
+ content: {
180
+ "application/json": {
181
+ schema: import("zod").ZodObject<{
182
+ id: import("zod").ZodNumber;
183
+ categoryId: import("zod").ZodNumber;
184
+ createdAt: import("zod").ZodDate;
185
+ updatedAt: import("zod").ZodDate;
186
+ }, import("zod/v4/core").$strip>;
187
+ };
188
+ };
189
+ description: string;
190
+ };
191
+ 400: {
192
+ description: string;
193
+ };
194
+ 404: {
195
+ description: string;
196
+ };
177
197
  };
178
- };
179
198
  } & {
180
- path: string;
199
+ path: string;
181
200
  }>, import("@vitnode/core/api/lib/route").Route<"@vitnode/blog", {
182
- method: "delete";
183
- path: "/{id}";
184
- request: {
185
- params: import("zod").ZodObject<{
186
- id: import("zod").ZodPipe<import("zod").ZodString, import("zod").ZodTransform<number, string>>;
187
- }, import("zod/v4/core").$strip>;
188
- };
189
- responses: {
190
- 204: {
191
- description: string;
192
- };
193
- 404: {
194
- description: string;
201
+ method: "delete";
202
+ path: "/{id}";
203
+ request: {
204
+ params: import("zod").ZodObject<{
205
+ id: import("zod").ZodPipe<import("zod").ZodString, import("zod").ZodTransform<number, string>>;
206
+ }, import("zod/v4/core").$strip>;
207
+ };
208
+ responses: {
209
+ 204: {
210
+ description: string;
211
+ };
212
+ 404: {
213
+ description: string;
214
+ };
195
215
  };
196
- };
197
216
  } & {
198
- path: string;
217
+ path: string;
199
218
  }>], import("@vitnode/core/api/lib/module").BaseBuildModuleReturn<"@vitnode/blog", string, import("@vitnode/core/api/lib/route").Route<"@vitnode/blog", import("@hono/zod-openapi").RouteConfig>[]>[]>)[]>;
200
- //#endregion
201
- export { adminModule };
202
219
  //# sourceMappingURL=admin.module.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"admin.module.d.ts","names":[],"sources":["../../../../../src/api/modules/admin/admin.module.ts"],"mappings":";cAMa,oDAAW,wFAAA,mFAAA"}
1
+ {"version":3,"file":"admin.module.d.ts","sourceRoot":"","sources":["../../../../../src/api/modules/admin/admin.module.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0MAStB,CAAC"}
@@ -1,2 +1 @@
1
- import{CONFIG_PLUGIN as e}from"../../../const.js";import{categoriesAdminModule as t}from"./categories/categories.admin.module.js";import{postsAdminModule as n}from"./posts/posts.admin.module.js";import{buildModule as r}from"@vitnode/core/api/lib/module";const i=r({pluginId:e.pluginId,name:`admin`,modules:[t,n],routes:[]});export{i as adminModule};
2
- //# sourceMappingURL=admin.module.js.map
1
+ import{buildModule}from"@vitnode/core/api/lib/module";import{CONFIG_PLUGIN}from"../../../const.js";import{cleanupCategorySearchListener}from"../../lib/events.js";import{categoriesAdminModule}from"./categories/categories.admin.module.js";import{postsAdminModule}from"./posts/posts.admin.module.js";export const adminModule=buildModule({pluginId:CONFIG_PLUGIN.pluginId,name:"admin",modules:[categoriesAdminModule,postsAdminModule],routes:[],events:[cleanupCategorySearchListener]});