@jant/core 0.1.2 → 0.2.0

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 (288) hide show
  1. package/dist/app.d.ts +34 -0
  2. package/dist/app.d.ts.map +1 -0
  3. package/dist/app.js +474 -0
  4. package/dist/assets/datastar.min.js +1775 -0
  5. package/dist/auth.d.ts +23 -0
  6. package/dist/auth.d.ts.map +1 -0
  7. package/dist/auth.js +34 -0
  8. package/{src/client.ts → dist/client.d.ts} +1 -1
  9. package/dist/client.d.ts.map +1 -0
  10. package/dist/client.js +4 -0
  11. package/dist/db/index.d.ts +10 -0
  12. package/dist/db/index.d.ts.map +1 -0
  13. package/dist/db/index.js +10 -0
  14. package/dist/db/schema.d.ts +1507 -0
  15. package/dist/db/schema.d.ts.map +1 -0
  16. package/dist/db/schema.js +183 -0
  17. package/{src/i18n/Trans.tsx → dist/i18n/Trans.d.ts} +4 -10
  18. package/dist/i18n/Trans.d.ts.map +1 -0
  19. package/dist/i18n/Trans.js +24 -0
  20. package/dist/i18n/context.d.ts +69 -0
  21. package/dist/i18n/context.d.ts.map +1 -0
  22. package/dist/i18n/context.js +61 -0
  23. package/dist/i18n/detect.d.ts +31 -0
  24. package/dist/i18n/detect.d.ts.map +1 -0
  25. package/dist/i18n/detect.js +77 -0
  26. package/{src/i18n/i18n.ts → dist/i18n/i18n.d.ts} +5 -25
  27. package/dist/i18n/i18n.d.ts.map +1 -0
  28. package/dist/i18n/i18n.js +55 -0
  29. package/dist/i18n/index.d.ts +41 -0
  30. package/dist/i18n/index.d.ts.map +1 -0
  31. package/{src/i18n/index.ts → dist/i18n/index.js} +3 -24
  32. package/dist/i18n/locales/en.d.ts +3 -0
  33. package/dist/i18n/locales/en.d.ts.map +1 -0
  34. package/dist/i18n/locales/en.js +1 -0
  35. package/dist/i18n/locales/zh-Hans.d.ts +3 -0
  36. package/dist/i18n/locales/zh-Hans.d.ts.map +1 -0
  37. package/dist/i18n/locales/zh-Hans.js +1 -0
  38. package/dist/i18n/locales/zh-Hant.d.ts +3 -0
  39. package/dist/i18n/locales/zh-Hant.d.ts.map +1 -0
  40. package/dist/i18n/locales/zh-Hant.js +1 -0
  41. package/dist/i18n/locales.d.ts +11 -0
  42. package/dist/i18n/locales.d.ts.map +1 -0
  43. package/dist/i18n/locales.js +13 -0
  44. package/dist/i18n/middleware.d.ts +24 -0
  45. package/dist/i18n/middleware.d.ts.map +1 -0
  46. package/dist/i18n/middleware.js +41 -0
  47. package/dist/index.d.ts +16 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/{src/index.ts → dist/index.js} +1 -28
  50. package/dist/lib/assets.d.ts +19 -0
  51. package/dist/lib/assets.d.ts.map +1 -0
  52. package/dist/lib/assets.js +33 -0
  53. package/dist/lib/constants.d.ts +36 -0
  54. package/dist/lib/constants.d.ts.map +1 -0
  55. package/dist/lib/constants.js +50 -0
  56. package/{src/lib/image.ts → dist/lib/image.d.ts} +13 -47
  57. package/dist/lib/image.d.ts.map +1 -0
  58. package/dist/lib/image.js +77 -0
  59. package/{src/lib/index.ts → dist/lib/index.d.ts} +1 -1
  60. package/dist/lib/index.d.ts.map +1 -0
  61. package/dist/lib/index.js +7 -0
  62. package/dist/lib/markdown.d.ts +60 -0
  63. package/dist/lib/markdown.d.ts.map +1 -0
  64. package/{src/lib/markdown.ts → dist/lib/markdown.js} +16 -26
  65. package/dist/lib/schemas.d.ts +113 -0
  66. package/dist/lib/schemas.d.ts.map +1 -0
  67. package/dist/lib/schemas.js +71 -0
  68. package/dist/lib/sqid.d.ts +60 -0
  69. package/dist/lib/sqid.d.ts.map +1 -0
  70. package/{src/lib/sqid.ts → dist/lib/sqid.js} +15 -22
  71. package/dist/lib/sse.d.ts +95 -0
  72. package/dist/lib/sse.d.ts.map +1 -0
  73. package/dist/lib/sse.js +81 -0
  74. package/dist/lib/time.d.ts +90 -0
  75. package/dist/lib/time.d.ts.map +1 -0
  76. package/{src/lib/time.ts → dist/lib/time.js} +20 -33
  77. package/{src/lib/url.ts → dist/lib/url.d.ts} +5 -30
  78. package/dist/lib/url.d.ts.map +1 -0
  79. package/dist/lib/url.js +89 -0
  80. package/dist/middleware/auth.d.ts +24 -0
  81. package/dist/middleware/auth.d.ts.map +1 -0
  82. package/dist/middleware/auth.js +52 -0
  83. package/dist/routes/api/posts.d.ts +13 -0
  84. package/dist/routes/api/posts.d.ts.map +1 -0
  85. package/dist/routes/api/posts.js +124 -0
  86. package/dist/routes/api/search.d.ts +13 -0
  87. package/dist/routes/api/search.d.ts.map +1 -0
  88. package/dist/routes/api/search.js +49 -0
  89. package/dist/routes/api/upload.d.ts +16 -0
  90. package/dist/routes/api/upload.d.ts.map +1 -0
  91. package/dist/routes/api/upload.js +227 -0
  92. package/dist/routes/dash/collections.d.ts +13 -0
  93. package/dist/routes/dash/collections.d.ts.map +1 -0
  94. package/dist/routes/dash/collections.js +512 -0
  95. package/dist/routes/dash/index.d.ts +15 -0
  96. package/dist/routes/dash/index.d.ts.map +1 -0
  97. package/dist/routes/dash/index.js +117 -0
  98. package/dist/routes/dash/media.d.ts +16 -0
  99. package/dist/routes/dash/media.d.ts.map +1 -0
  100. package/dist/routes/dash/media.js +589 -0
  101. package/dist/routes/dash/pages.d.ts +15 -0
  102. package/dist/routes/dash/pages.d.ts.map +1 -0
  103. package/dist/routes/dash/pages.js +290 -0
  104. package/dist/routes/dash/posts.d.ts +13 -0
  105. package/dist/routes/dash/posts.d.ts.map +1 -0
  106. package/dist/routes/dash/posts.js +226 -0
  107. package/dist/routes/dash/redirects.d.ts +13 -0
  108. package/dist/routes/dash/redirects.d.ts.map +1 -0
  109. package/dist/routes/dash/redirects.js +237 -0
  110. package/dist/routes/dash/settings.d.ts +13 -0
  111. package/dist/routes/dash/settings.d.ts.map +1 -0
  112. package/dist/routes/dash/settings.js +154 -0
  113. package/dist/routes/feed/rss.d.ts +13 -0
  114. package/dist/routes/feed/rss.d.ts.map +1 -0
  115. package/dist/routes/feed/rss.js +95 -0
  116. package/dist/routes/feed/sitemap.d.ts +13 -0
  117. package/dist/routes/feed/sitemap.d.ts.map +1 -0
  118. package/dist/routes/feed/sitemap.js +59 -0
  119. package/dist/routes/pages/archive.d.ts +15 -0
  120. package/dist/routes/pages/archive.d.ts.map +1 -0
  121. package/dist/routes/pages/archive.js +255 -0
  122. package/dist/routes/pages/collection.d.ts +13 -0
  123. package/dist/routes/pages/collection.d.ts.map +1 -0
  124. package/dist/routes/pages/collection.js +93 -0
  125. package/dist/routes/pages/home.d.ts +13 -0
  126. package/dist/routes/pages/home.d.ts.map +1 -0
  127. package/dist/routes/pages/home.js +122 -0
  128. package/dist/routes/pages/page.d.ts +15 -0
  129. package/dist/routes/pages/page.d.ts.map +1 -0
  130. package/dist/routes/pages/page.js +69 -0
  131. package/dist/routes/pages/post.d.ts +13 -0
  132. package/dist/routes/pages/post.d.ts.map +1 -0
  133. package/dist/routes/pages/post.js +90 -0
  134. package/dist/routes/pages/search.d.ts +13 -0
  135. package/dist/routes/pages/search.d.ts.map +1 -0
  136. package/dist/routes/pages/search.js +180 -0
  137. package/dist/services/collection.d.ts +31 -0
  138. package/dist/services/collection.d.ts.map +1 -0
  139. package/dist/services/collection.js +108 -0
  140. package/dist/services/index.d.ts +28 -0
  141. package/dist/services/index.d.ts.map +1 -0
  142. package/dist/services/index.js +20 -0
  143. package/dist/services/media.d.ts +27 -0
  144. package/dist/services/media.d.ts.map +1 -0
  145. package/dist/services/media.js +62 -0
  146. package/dist/services/post.d.ts +31 -0
  147. package/dist/services/post.d.ts.map +1 -0
  148. package/dist/services/post.js +191 -0
  149. package/dist/services/redirect.d.ts +15 -0
  150. package/dist/services/redirect.d.ts.map +1 -0
  151. package/dist/services/redirect.js +48 -0
  152. package/dist/services/search.d.ts +26 -0
  153. package/dist/services/search.d.ts.map +1 -0
  154. package/dist/services/search.js +61 -0
  155. package/dist/services/settings.d.ts +17 -0
  156. package/dist/services/settings.d.ts.map +1 -0
  157. package/dist/services/settings.js +65 -0
  158. package/dist/theme/components/ActionButtons.d.ts +43 -0
  159. package/dist/theme/components/ActionButtons.d.ts.map +1 -0
  160. package/dist/theme/components/ActionButtons.js +50 -0
  161. package/dist/theme/components/CrudPageHeader.d.ts +23 -0
  162. package/dist/theme/components/CrudPageHeader.d.ts.map +1 -0
  163. package/dist/theme/components/CrudPageHeader.js +22 -0
  164. package/dist/theme/components/DangerZone.d.ts +36 -0
  165. package/dist/theme/components/DangerZone.d.ts.map +1 -0
  166. package/dist/theme/components/DangerZone.js +39 -0
  167. package/dist/theme/components/EmptyState.d.ts +27 -0
  168. package/dist/theme/components/EmptyState.d.ts.map +1 -0
  169. package/dist/theme/components/EmptyState.js +27 -0
  170. package/dist/theme/components/ListItemRow.d.ts +15 -0
  171. package/dist/theme/components/ListItemRow.d.ts.map +1 -0
  172. package/dist/theme/components/ListItemRow.js +21 -0
  173. package/dist/theme/components/PageForm.d.ts +14 -0
  174. package/dist/theme/components/PageForm.d.ts.map +1 -0
  175. package/dist/theme/components/PageForm.js +173 -0
  176. package/dist/theme/components/Pagination.d.ts +46 -0
  177. package/dist/theme/components/Pagination.d.ts.map +1 -0
  178. package/dist/theme/components/Pagination.js +159 -0
  179. package/dist/theme/components/PostForm.d.ts +12 -0
  180. package/dist/theme/components/PostForm.d.ts.map +1 -0
  181. package/dist/theme/components/PostForm.js +230 -0
  182. package/dist/theme/components/PostList.d.ts +10 -0
  183. package/dist/theme/components/PostList.d.ts.map +1 -0
  184. package/dist/theme/components/PostList.js +73 -0
  185. package/dist/theme/components/ThreadView.d.ts +15 -0
  186. package/dist/theme/components/ThreadView.d.ts.map +1 -0
  187. package/dist/theme/components/ThreadView.js +111 -0
  188. package/dist/theme/components/TypeBadge.d.ts +12 -0
  189. package/dist/theme/components/TypeBadge.d.ts.map +1 -0
  190. package/dist/theme/components/TypeBadge.js +39 -0
  191. package/dist/theme/components/VisibilityBadge.d.ts +12 -0
  192. package/dist/theme/components/VisibilityBadge.d.ts.map +1 -0
  193. package/dist/theme/components/VisibilityBadge.js +37 -0
  194. package/{src/theme/components/index.ts → dist/theme/components/index.d.ts} +1 -0
  195. package/dist/theme/components/index.d.ts.map +1 -0
  196. package/dist/theme/components/index.js +12 -0
  197. package/dist/theme/index.d.ts +21 -0
  198. package/dist/theme/index.d.ts.map +1 -0
  199. package/{src/theme/index.ts → dist/theme/index.js} +1 -4
  200. package/dist/theme/layouts/BaseLayout.d.ts +16 -0
  201. package/dist/theme/layouts/BaseLayout.d.ts.map +1 -0
  202. package/dist/theme/layouts/BaseLayout.js +58 -0
  203. package/dist/theme/layouts/DashLayout.d.ts +15 -0
  204. package/dist/theme/layouts/DashLayout.d.ts.map +1 -0
  205. package/dist/theme/layouts/DashLayout.js +139 -0
  206. package/{src/theme/layouts/index.ts → dist/theme/layouts/index.d.ts} +1 -0
  207. package/dist/theme/layouts/index.d.ts.map +1 -0
  208. package/dist/theme/layouts/index.js +2 -0
  209. package/dist/theme/styles/main.css +2 -0
  210. package/dist/types.d.ts +179 -0
  211. package/dist/types.d.ts.map +1 -0
  212. package/dist/types.js +19 -0
  213. package/package.json +26 -26
  214. package/drizzle.config.ts +0 -10
  215. package/lingui.config.ts +0 -16
  216. package/src/app.tsx +0 -377
  217. package/src/assets/datastar.min.js +0 -8
  218. package/src/auth.ts +0 -38
  219. package/src/db/index.ts +0 -14
  220. package/src/db/migrations/0000_solid_moon_knight.sql +0 -118
  221. package/src/db/migrations/0001_add_search_fts.sql +0 -40
  222. package/src/db/migrations/0002_collection_path.sql +0 -2
  223. package/src/db/migrations/0003_collection_path_nullable.sql +0 -21
  224. package/src/db/migrations/0004_media_uuid.sql +0 -35
  225. package/src/db/migrations/meta/0000_snapshot.json +0 -784
  226. package/src/db/migrations/meta/_journal.json +0 -41
  227. package/src/db/schema.ts +0 -159
  228. package/src/i18n/EXAMPLES.md +0 -235
  229. package/src/i18n/README.md +0 -296
  230. package/src/i18n/context.tsx +0 -101
  231. package/src/i18n/detect.ts +0 -100
  232. package/src/i18n/locales/en.po +0 -875
  233. package/src/i18n/locales/en.ts +0 -1
  234. package/src/i18n/locales/zh-Hans.po +0 -875
  235. package/src/i18n/locales/zh-Hans.ts +0 -1
  236. package/src/i18n/locales/zh-Hant.po +0 -875
  237. package/src/i18n/locales/zh-Hant.ts +0 -1
  238. package/src/i18n/locales.ts +0 -14
  239. package/src/i18n/middleware.ts +0 -59
  240. package/src/lib/assets.ts +0 -47
  241. package/src/lib/constants.ts +0 -67
  242. package/src/lib/schemas.ts +0 -92
  243. package/src/lib/sse.ts +0 -152
  244. package/src/middleware/auth.ts +0 -59
  245. package/src/routes/api/posts.ts +0 -127
  246. package/src/routes/api/search.ts +0 -53
  247. package/src/routes/api/upload.ts +0 -240
  248. package/src/routes/dash/collections.tsx +0 -341
  249. package/src/routes/dash/index.tsx +0 -89
  250. package/src/routes/dash/media.tsx +0 -551
  251. package/src/routes/dash/pages.tsx +0 -245
  252. package/src/routes/dash/posts.tsx +0 -202
  253. package/src/routes/dash/redirects.tsx +0 -155
  254. package/src/routes/dash/settings.tsx +0 -93
  255. package/src/routes/feed/rss.ts +0 -119
  256. package/src/routes/feed/sitemap.ts +0 -75
  257. package/src/routes/pages/archive.tsx +0 -223
  258. package/src/routes/pages/collection.tsx +0 -79
  259. package/src/routes/pages/home.tsx +0 -93
  260. package/src/routes/pages/page.tsx +0 -64
  261. package/src/routes/pages/post.tsx +0 -81
  262. package/src/routes/pages/search.tsx +0 -162
  263. package/src/services/collection.ts +0 -180
  264. package/src/services/index.ts +0 -40
  265. package/src/services/media.ts +0 -97
  266. package/src/services/post.ts +0 -279
  267. package/src/services/redirect.ts +0 -74
  268. package/src/services/search.ts +0 -117
  269. package/src/services/settings.ts +0 -76
  270. package/src/theme/components/ActionButtons.tsx +0 -98
  271. package/src/theme/components/CrudPageHeader.tsx +0 -48
  272. package/src/theme/components/DangerZone.tsx +0 -77
  273. package/src/theme/components/EmptyState.tsx +0 -56
  274. package/src/theme/components/ListItemRow.tsx +0 -24
  275. package/src/theme/components/PageForm.tsx +0 -114
  276. package/src/theme/components/Pagination.tsx +0 -196
  277. package/src/theme/components/PostForm.tsx +0 -122
  278. package/src/theme/components/PostList.tsx +0 -68
  279. package/src/theme/components/ThreadView.tsx +0 -118
  280. package/src/theme/components/TypeBadge.tsx +0 -28
  281. package/src/theme/components/VisibilityBadge.tsx +0 -33
  282. package/src/theme/layouts/BaseLayout.tsx +0 -49
  283. package/src/theme/layouts/DashLayout.tsx +0 -108
  284. package/src/theme/styles/main.css +0 -52
  285. package/src/types.ts +0 -222
  286. package/tsconfig.json +0 -16
  287. package/vite.config.ts +0 -82
  288. package/wrangler.toml +0 -21
@@ -0,0 +1,90 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "hono/jsx/jsx-runtime";
2
+ /**
3
+ * Single Post Page Route
4
+ */ import { Hono } from "hono";
5
+ import { useLingui } from "../../i18n/index.js";
6
+ import { BaseLayout } from "../../theme/layouts/index.js";
7
+ import * as sqid from "../../lib/sqid.js";
8
+ import * as time from "../../lib/time.js";
9
+ export const postRoutes = new Hono();
10
+ function PostContent({ post }) {
11
+ const { t } = useLingui();
12
+ return /*#__PURE__*/ _jsxs("div", {
13
+ class: "container py-8",
14
+ children: [
15
+ /*#__PURE__*/ _jsxs("article", {
16
+ class: "h-entry",
17
+ children: [
18
+ post.title && /*#__PURE__*/ _jsx("h1", {
19
+ class: "p-name text-2xl font-semibold mb-4",
20
+ children: post.title
21
+ }),
22
+ /*#__PURE__*/ _jsx("div", {
23
+ class: "e-content prose",
24
+ dangerouslySetInnerHTML: {
25
+ __html: post.contentHtml || ""
26
+ }
27
+ }),
28
+ /*#__PURE__*/ _jsxs("footer", {
29
+ class: "mt-6 pt-4 border-t text-sm text-muted-foreground",
30
+ children: [
31
+ /*#__PURE__*/ _jsx("time", {
32
+ class: "dt-published",
33
+ datetime: time.toISOString(post.publishedAt),
34
+ children: time.formatDate(post.publishedAt)
35
+ }),
36
+ /*#__PURE__*/ _jsx("a", {
37
+ href: `/p/${sqid.encode(post.id)}`,
38
+ class: "u-url ml-4",
39
+ children: t({
40
+ message: "Permalink",
41
+ comment: "@context: Link to permanent URL of post"
42
+ })
43
+ })
44
+ ]
45
+ })
46
+ ]
47
+ }),
48
+ /*#__PURE__*/ _jsx("nav", {
49
+ class: "mt-8",
50
+ children: /*#__PURE__*/ _jsx("a", {
51
+ href: "/",
52
+ class: "text-sm hover:underline",
53
+ children: t({
54
+ message: "← Back to home",
55
+ comment: "@context: Navigation link"
56
+ })
57
+ })
58
+ })
59
+ ]
60
+ });
61
+ }
62
+ postRoutes.get("/:id", async (c)=>{
63
+ const paramId = c.req.param("id");
64
+ // Try to decode as sqid first
65
+ let id = sqid.decode(paramId);
66
+ // If not a valid sqid, try to find by path
67
+ if (!id) {
68
+ const post = await c.var.services.posts.getByPath(paramId);
69
+ if (post) {
70
+ id = post.id;
71
+ }
72
+ }
73
+ if (!id) return c.notFound();
74
+ const post = await c.var.services.posts.getById(id);
75
+ if (!post) return c.notFound();
76
+ // Don't show drafts on public site
77
+ if (post.visibility === "draft") {
78
+ return c.notFound();
79
+ }
80
+ const siteName = await c.var.services.settings.get("SITE_NAME") ?? "Jant";
81
+ const title = post.title || siteName;
82
+ return c.html(/*#__PURE__*/ _jsx(BaseLayout, {
83
+ title: title,
84
+ description: post.content?.slice(0, 160),
85
+ c: c,
86
+ children: /*#__PURE__*/ _jsx(PostContent, {
87
+ post: post
88
+ })
89
+ }));
90
+ });
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Search Page Route
3
+ */
4
+ import { Hono } from "hono";
5
+ import type { Bindings } from "../../types.js";
6
+ import type { AppVariables } from "../../app.js";
7
+ type Env = {
8
+ Bindings: Bindings;
9
+ Variables: AppVariables;
10
+ };
11
+ export declare const searchRoutes: Hono<Env, import("hono/types").BlankSchema, "/">;
12
+ export {};
13
+ //# sourceMappingURL=search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../../src/routes/pages/search.tsx"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAOjD,KAAK,GAAG,GAAG;IAAE,QAAQ,EAAE,QAAQ,CAAC;IAAC,SAAS,EAAE,YAAY,CAAA;CAAE,CAAC;AAI3D,eAAO,MAAM,YAAY,kDAAkB,CAAC"}
@@ -0,0 +1,180 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "hono/jsx/jsx-runtime";
2
+ /**
3
+ * Search Page Route
4
+ */ import { Hono } from "hono";
5
+ import { useLingui } from "../../i18n/index.js";
6
+ import { BaseLayout } from "../../theme/layouts/index.js";
7
+ import { PagePagination } from "../../theme/components/index.js";
8
+ import * as sqid from "../../lib/sqid.js";
9
+ import * as time from "../../lib/time.js";
10
+ const PAGE_SIZE = 10;
11
+ export const searchRoutes = new Hono();
12
+ function SearchContent({ query, results, error, hasMore, page }) {
13
+ const { t } = useLingui();
14
+ const searchTitle = t({
15
+ message: "Search",
16
+ comment: "@context: Search page title"
17
+ });
18
+ return /*#__PURE__*/ _jsxs("div", {
19
+ class: "container py-8 max-w-2xl",
20
+ children: [
21
+ /*#__PURE__*/ _jsx("h1", {
22
+ class: "text-2xl font-semibold mb-6",
23
+ children: searchTitle
24
+ }),
25
+ /*#__PURE__*/ _jsx("form", {
26
+ method: "get",
27
+ action: "/search",
28
+ class: "mb-8",
29
+ children: /*#__PURE__*/ _jsxs("div", {
30
+ class: "flex gap-2",
31
+ children: [
32
+ /*#__PURE__*/ _jsx("input", {
33
+ type: "search",
34
+ name: "q",
35
+ class: "input flex-1",
36
+ placeholder: t({
37
+ message: "Search posts...",
38
+ comment: "@context: Search input placeholder"
39
+ }),
40
+ value: query,
41
+ autofocus: true
42
+ }),
43
+ /*#__PURE__*/ _jsx("button", {
44
+ type: "submit",
45
+ class: "btn",
46
+ children: t({
47
+ message: "Search",
48
+ comment: "@context: Search submit button"
49
+ })
50
+ })
51
+ ]
52
+ })
53
+ }),
54
+ error && /*#__PURE__*/ _jsx("div", {
55
+ class: "p-4 rounded-lg bg-destructive/10 text-destructive mb-6",
56
+ children: error
57
+ }),
58
+ query && !error && /*#__PURE__*/ _jsxs("div", {
59
+ children: [
60
+ /*#__PURE__*/ _jsx("p", {
61
+ class: "text-sm text-muted-foreground mb-4",
62
+ children: results.length === 0 ? t({
63
+ message: "No results found.",
64
+ comment: "@context: Search empty results"
65
+ }) : results.length === 1 ? t({
66
+ message: "Found 1 result",
67
+ comment: "@context: Search results count - single"
68
+ }) : t({
69
+ message: "Found {count} results",
70
+ comment: "@context: Search results count - multiple",
71
+ values: {
72
+ count: String(results.length)
73
+ }
74
+ })
75
+ }),
76
+ results.length > 0 && /*#__PURE__*/ _jsxs(_Fragment, {
77
+ children: [
78
+ /*#__PURE__*/ _jsx("div", {
79
+ class: "flex flex-col gap-4",
80
+ children: results.map((result)=>/*#__PURE__*/ _jsx("article", {
81
+ class: "p-4 rounded-lg border hover:border-primary",
82
+ children: /*#__PURE__*/ _jsxs("a", {
83
+ href: `/p/${sqid.encode(result.post.id)}`,
84
+ class: "block",
85
+ children: [
86
+ /*#__PURE__*/ _jsx("h2", {
87
+ class: "font-medium hover:underline",
88
+ children: result.post.title || result.post.content?.slice(0, 60) || `Post #${result.post.id}`
89
+ }),
90
+ result.snippet && /*#__PURE__*/ _jsx("p", {
91
+ class: "text-sm text-muted-foreground mt-2 line-clamp-2",
92
+ dangerouslySetInnerHTML: {
93
+ __html: result.snippet
94
+ }
95
+ }),
96
+ /*#__PURE__*/ _jsxs("footer", {
97
+ class: "flex items-center gap-2 mt-2 text-xs text-muted-foreground",
98
+ children: [
99
+ /*#__PURE__*/ _jsx("span", {
100
+ class: "badge-outline",
101
+ children: result.post.type
102
+ }),
103
+ /*#__PURE__*/ _jsx("time", {
104
+ datetime: time.toISOString(result.post.publishedAt),
105
+ children: time.formatDate(result.post.publishedAt)
106
+ })
107
+ ]
108
+ })
109
+ ]
110
+ })
111
+ }, result.post.id))
112
+ }),
113
+ /*#__PURE__*/ _jsx(PagePagination, {
114
+ baseUrl: `/search?q=${encodeURIComponent(query)}`,
115
+ currentPage: page,
116
+ hasMore: hasMore
117
+ })
118
+ ]
119
+ })
120
+ ]
121
+ }),
122
+ /*#__PURE__*/ _jsx("nav", {
123
+ class: "mt-8 pt-6 border-t",
124
+ children: /*#__PURE__*/ _jsxs("a", {
125
+ href: "/",
126
+ class: "text-sm hover:underline",
127
+ children: [
128
+ "← ",
129
+ t({
130
+ message: "Back to home",
131
+ comment: "@context: Navigation link back to home page"
132
+ })
133
+ ]
134
+ })
135
+ })
136
+ ]
137
+ });
138
+ }
139
+ searchRoutes.get("/", async (c)=>{
140
+ const query = c.req.query("q") || "";
141
+ const pageParam = c.req.query("page");
142
+ const page = pageParam ? Math.max(1, parseInt(pageParam, 10) || 1) : 1;
143
+ const siteName = await c.var.services.settings.get("SITE_NAME") ?? "Jant";
144
+ // Only search if there's a query
145
+ let results = [];
146
+ let error = null;
147
+ let hasMore = false;
148
+ if (query.trim()) {
149
+ try {
150
+ // Fetch one extra to check for more
151
+ results = await c.var.services.search.search(query, {
152
+ limit: PAGE_SIZE + 1,
153
+ offset: (page - 1) * PAGE_SIZE,
154
+ visibility: [
155
+ "featured",
156
+ "quiet"
157
+ ]
158
+ });
159
+ hasMore = results.length > PAGE_SIZE;
160
+ if (hasMore) {
161
+ results = results.slice(0, PAGE_SIZE);
162
+ }
163
+ } catch (err) {
164
+ // eslint-disable-next-line no-console -- Error logging is intentional
165
+ console.error("Search error:", err);
166
+ error = "Search failed. Please try again.";
167
+ }
168
+ }
169
+ return c.html(/*#__PURE__*/ _jsx(BaseLayout, {
170
+ title: query ? `Search: ${query} - ${siteName}` : `Search - ${siteName}`,
171
+ c: c,
172
+ children: /*#__PURE__*/ _jsx(SearchContent, {
173
+ query: query,
174
+ results: results,
175
+ error: error,
176
+ hasMore: hasMore,
177
+ page: page
178
+ })
179
+ }));
180
+ });
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Collection Service
3
+ *
4
+ * Manages collections and post-collection relationships
5
+ */
6
+ import type { Database } from "../db/index.js";
7
+ import type { Collection, Post } from "../types.js";
8
+ export interface CollectionService {
9
+ getById(id: number): Promise<Collection | null>;
10
+ getByPath(path: string): Promise<Collection | null>;
11
+ list(): Promise<Collection[]>;
12
+ create(data: CreateCollectionData): Promise<Collection>;
13
+ update(id: number, data: UpdateCollectionData): Promise<Collection | null>;
14
+ delete(id: number): Promise<boolean>;
15
+ addPost(collectionId: number, postId: number): Promise<void>;
16
+ removePost(collectionId: number, postId: number): Promise<void>;
17
+ getPosts(collectionId: number): Promise<Post[]>;
18
+ getCollectionsForPost(postId: number): Promise<Collection[]>;
19
+ }
20
+ export interface CreateCollectionData {
21
+ title: string;
22
+ path?: string;
23
+ description?: string;
24
+ }
25
+ export interface UpdateCollectionData {
26
+ title?: string;
27
+ path?: string | null;
28
+ description?: string;
29
+ }
30
+ export declare function createCollectionService(db: Database): CollectionService;
31
+ //# sourceMappingURL=collection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collection.d.ts","sourceRoot":"","sources":["../../src/services/collection.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAG/C,OAAO,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAEpD,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IAChD,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IACpD,IAAI,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IAC9B,MAAM,CAAC,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACxD,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IAC3E,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACrC,OAAO,CAAC,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7D,UAAU,CAAC,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChE,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAChD,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;CAC9D;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,uBAAuB,CAAC,EAAE,EAAE,QAAQ,GAAG,iBAAiB,CA8IvE"}
@@ -0,0 +1,108 @@
1
+ /**
2
+ * Collection Service
3
+ *
4
+ * Manages collections and post-collection relationships
5
+ */ import { eq, desc, and } from "drizzle-orm";
6
+ import { collections, postCollections, posts } from "../db/schema.js";
7
+ import { now } from "../lib/time.js";
8
+ export function createCollectionService(db) {
9
+ function toCollection(row) {
10
+ return {
11
+ id: row.id,
12
+ title: row.title,
13
+ path: row.path,
14
+ description: row.description,
15
+ createdAt: row.createdAt,
16
+ updatedAt: row.updatedAt
17
+ };
18
+ }
19
+ function toPost(row) {
20
+ return {
21
+ id: row.id,
22
+ type: row.type,
23
+ visibility: row.visibility,
24
+ title: row.title,
25
+ path: row.path,
26
+ content: row.content,
27
+ contentHtml: row.contentHtml,
28
+ sourceUrl: row.sourceUrl,
29
+ sourceName: row.sourceName,
30
+ sourceDomain: row.sourceDomain,
31
+ replyToId: row.replyToId,
32
+ threadId: row.threadId,
33
+ deletedAt: row.deletedAt,
34
+ publishedAt: row.publishedAt,
35
+ createdAt: row.createdAt,
36
+ updatedAt: row.updatedAt
37
+ };
38
+ }
39
+ return {
40
+ async getById (id) {
41
+ const result = await db.select().from(collections).where(eq(collections.id, id)).limit(1);
42
+ return result[0] ? toCollection(result[0]) : null;
43
+ },
44
+ async getByPath (path) {
45
+ const result = await db.select().from(collections).where(eq(collections.path, path)).limit(1);
46
+ return result[0] ? toCollection(result[0]) : null;
47
+ },
48
+ async list () {
49
+ const rows = await db.select().from(collections).orderBy(desc(collections.createdAt));
50
+ return rows.map(toCollection);
51
+ },
52
+ async create (data) {
53
+ const timestamp = now();
54
+ const result = await db.insert(collections).values({
55
+ title: data.title,
56
+ path: data.path || null,
57
+ description: data.description ?? null,
58
+ createdAt: timestamp,
59
+ updatedAt: timestamp
60
+ }).returning();
61
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- DB insert with .returning() always returns inserted row
62
+ return toCollection(result[0]);
63
+ },
64
+ async update (id, data) {
65
+ const existing = await this.getById(id);
66
+ if (!existing) return null;
67
+ const timestamp = now();
68
+ const updates = {
69
+ updatedAt: timestamp
70
+ };
71
+ if (data.title !== undefined) updates.title = data.title;
72
+ if (data.path !== undefined) updates.path = data.path;
73
+ if (data.description !== undefined) updates.description = data.description;
74
+ const result = await db.update(collections).set(updates).where(eq(collections.id, id)).returning();
75
+ return result[0] ? toCollection(result[0]) : null;
76
+ },
77
+ async delete (id) {
78
+ // Delete all post-collection relationships first
79
+ await db.delete(postCollections).where(eq(postCollections.collectionId, id));
80
+ const result = await db.delete(collections).where(eq(collections.id, id)).returning();
81
+ return result.length > 0;
82
+ },
83
+ async addPost (collectionId, postId) {
84
+ const timestamp = now();
85
+ // Upsert the relationship
86
+ await db.insert(postCollections).values({
87
+ postId,
88
+ collectionId,
89
+ addedAt: timestamp
90
+ }).onConflictDoNothing();
91
+ },
92
+ async removePost (collectionId, postId) {
93
+ await db.delete(postCollections).where(and(eq(postCollections.collectionId, collectionId), eq(postCollections.postId, postId)));
94
+ },
95
+ async getPosts (collectionId) {
96
+ const rows = await db.select({
97
+ post: posts
98
+ }).from(postCollections).innerJoin(posts, eq(postCollections.postId, posts.id)).where(eq(postCollections.collectionId, collectionId)).orderBy(desc(postCollections.addedAt));
99
+ return rows.map((r)=>toPost(r.post));
100
+ },
101
+ async getCollectionsForPost (postId) {
102
+ const rows = await db.select({
103
+ collection: collections
104
+ }).from(postCollections).innerJoin(collections, eq(postCollections.collectionId, collections.id)).where(eq(postCollections.postId, postId));
105
+ return rows.map((r)=>toCollection(r.collection));
106
+ }
107
+ };
108
+ }
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Services
3
+ *
4
+ * Business logic layer
5
+ */
6
+ import type { Database } from "../db/index.js";
7
+ import { type SettingsService } from "./settings.js";
8
+ import { type PostService } from "./post.js";
9
+ import { type RedirectService } from "./redirect.js";
10
+ import { type MediaService } from "./media.js";
11
+ import { type CollectionService } from "./collection.js";
12
+ import { type SearchService } from "./search.js";
13
+ export interface Services {
14
+ settings: SettingsService;
15
+ posts: PostService;
16
+ redirects: RedirectService;
17
+ media: MediaService;
18
+ collections: CollectionService;
19
+ search: SearchService;
20
+ }
21
+ export declare function createServices(db: Database, d1: D1Database): Services;
22
+ export type { SettingsService } from "./settings.js";
23
+ export type { PostService, PostFilters } from "./post.js";
24
+ export type { RedirectService } from "./redirect.js";
25
+ export type { MediaService } from "./media.js";
26
+ export type { CollectionService } from "./collection.js";
27
+ export type { SearchService, SearchResult, SearchOptions } from "./search.js";
28
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAyB,KAAK,eAAe,EAAE,MAAM,eAAe,CAAC;AAC5E,OAAO,EAAqB,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;AAChE,OAAO,EAAyB,KAAK,eAAe,EAAE,MAAM,eAAe,CAAC;AAC5E,OAAO,EAAsB,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AACnE,OAAO,EAA2B,KAAK,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAClF,OAAO,EAAuB,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAEtE,MAAM,WAAW,QAAQ;IACvB,QAAQ,EAAE,eAAe,CAAC;IAC1B,KAAK,EAAE,WAAW,CAAC;IACnB,SAAS,EAAE,eAAe,CAAC;IAC3B,KAAK,EAAE,YAAY,CAAC;IACpB,WAAW,EAAE,iBAAiB,CAAC;IAC/B,MAAM,EAAE,aAAa,CAAC;CACvB;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,GAAG,QAAQ,CASrE;AAED,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC1D,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,YAAY,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACzD,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Services
3
+ *
4
+ * Business logic layer
5
+ */ import { createSettingsService } from "./settings.js";
6
+ import { createPostService } from "./post.js";
7
+ import { createRedirectService } from "./redirect.js";
8
+ import { createMediaService } from "./media.js";
9
+ import { createCollectionService } from "./collection.js";
10
+ import { createSearchService } from "./search.js";
11
+ export function createServices(db, d1) {
12
+ return {
13
+ settings: createSettingsService(db),
14
+ posts: createPostService(db),
15
+ redirects: createRedirectService(db),
16
+ media: createMediaService(db),
17
+ collections: createCollectionService(db),
18
+ search: createSearchService(d1)
19
+ };
20
+ }
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Media Service
3
+ *
4
+ * Handles media upload and management with R2 storage
5
+ */
6
+ import type { Database } from "../db/index.js";
7
+ import type { Media } from "../types.js";
8
+ export interface MediaService {
9
+ getById(id: string): Promise<Media | null>;
10
+ list(limit?: number): Promise<Media[]>;
11
+ create(data: CreateMediaData): Promise<Media>;
12
+ delete(id: string): Promise<boolean>;
13
+ getByR2Key(r2Key: string): Promise<Media | null>;
14
+ }
15
+ export interface CreateMediaData {
16
+ postId?: number;
17
+ filename: string;
18
+ originalName: string;
19
+ mimeType: string;
20
+ size: number;
21
+ r2Key: string;
22
+ width?: number;
23
+ height?: number;
24
+ alt?: string;
25
+ }
26
+ export declare function createMediaService(db: Database): MediaService;
27
+ //# sourceMappingURL=media.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media.d.ts","sourceRoot":"","sources":["../../src/services/media.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAG/C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;IAC3C,IAAI,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;IACvC,MAAM,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACrC,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;CAClD;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,QAAQ,GAAG,YAAY,CA+D7D"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Media Service
3
+ *
4
+ * Handles media upload and management with R2 storage
5
+ */ import { eq, desc } from "drizzle-orm";
6
+ import { uuidv7 } from "uuidv7";
7
+ import { media } from "../db/schema.js";
8
+ import { now } from "../lib/time.js";
9
+ export function createMediaService(db) {
10
+ function toMedia(row) {
11
+ return {
12
+ id: row.id,
13
+ postId: row.postId,
14
+ filename: row.filename,
15
+ originalName: row.originalName,
16
+ mimeType: row.mimeType,
17
+ size: row.size,
18
+ r2Key: row.r2Key,
19
+ width: row.width,
20
+ height: row.height,
21
+ alt: row.alt,
22
+ createdAt: row.createdAt
23
+ };
24
+ }
25
+ return {
26
+ async getById (id) {
27
+ const result = await db.select().from(media).where(eq(media.id, id)).limit(1);
28
+ return result[0] ? toMedia(result[0]) : null;
29
+ },
30
+ async getByR2Key (r2Key) {
31
+ const result = await db.select().from(media).where(eq(media.r2Key, r2Key)).limit(1);
32
+ return result[0] ? toMedia(result[0]) : null;
33
+ },
34
+ async list (limit = 100) {
35
+ const rows = await db.select().from(media).orderBy(desc(media.createdAt)).limit(limit);
36
+ return rows.map(toMedia);
37
+ },
38
+ async create (data) {
39
+ const id = uuidv7();
40
+ const timestamp = now();
41
+ const result = await db.insert(media).values({
42
+ id,
43
+ postId: data.postId ?? null,
44
+ filename: data.filename,
45
+ originalName: data.originalName,
46
+ mimeType: data.mimeType,
47
+ size: data.size,
48
+ r2Key: data.r2Key,
49
+ width: data.width ?? null,
50
+ height: data.height ?? null,
51
+ alt: data.alt ?? null,
52
+ createdAt: timestamp
53
+ }).returning();
54
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- DB insert with .returning() always returns inserted row
55
+ return toMedia(result[0]);
56
+ },
57
+ async delete (id) {
58
+ const result = await db.delete(media).where(eq(media.id, id)).returning();
59
+ return result.length > 0;
60
+ }
61
+ };
62
+ }
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Post Service
3
+ *
4
+ * CRUD operations for posts with Thread support
5
+ */
6
+ import type { Database } from "../db/index.js";
7
+ import type { PostType, Visibility, Post, CreatePost, UpdatePost } from "../types.js";
8
+ export interface PostFilters {
9
+ type?: PostType;
10
+ visibility?: Visibility | Visibility[];
11
+ includeDeleted?: boolean;
12
+ threadId?: number;
13
+ /** Exclude posts that are replies (have threadId set) */
14
+ excludeReplies?: boolean;
15
+ limit?: number;
16
+ cursor?: number;
17
+ }
18
+ export interface PostService {
19
+ getById(id: number): Promise<Post | null>;
20
+ getByPath(path: string): Promise<Post | null>;
21
+ list(filters?: PostFilters): Promise<Post[]>;
22
+ create(data: CreatePost): Promise<Post>;
23
+ update(id: number, data: UpdatePost): Promise<Post | null>;
24
+ delete(id: number): Promise<boolean>;
25
+ getThread(rootId: number): Promise<Post[]>;
26
+ updateThreadVisibility(rootId: number, visibility: Visibility): Promise<void>;
27
+ /** Get reply counts for multiple posts */
28
+ getReplyCounts(postIds: number[]): Promise<Map<number, number>>;
29
+ }
30
+ export declare function createPostService(db: Database): PostService;
31
+ //# sourceMappingURL=post.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"post.d.ts","sourceRoot":"","sources":["../../src/services/post.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAK/C,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEtF,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,UAAU,CAAC,EAAE,UAAU,GAAG,UAAU,EAAE,CAAC;IACvC,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yDAAyD;IACzD,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;IAC1C,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;IAC9C,IAAI,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAC7C,MAAM,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;IAC3D,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACrC,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAC3C,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9E,0CAA0C;IAC1C,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACjE;AAED,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,QAAQ,GAAG,WAAW,CAgP3D"}